You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
360 lines
12 KiB
360 lines
12 KiB
<?php
|
|
/**
|
|
*
|
|
*/
|
|
include_once(SERVER_ROOT . "/model/mBase.php");
|
|
|
|
|
|
class mFormula extends mBase {
|
|
private $obj;
|
|
private $tbl;
|
|
private $formula_herb_tbl;
|
|
private $herb_tbl;
|
|
private $collect_log_tbl;
|
|
private $formula_use_log_tbl;
|
|
|
|
public function __construct() {
|
|
$this->obj = new dFormula();
|
|
$this->tbl = 'tcm_formula';
|
|
$this->formula_herb_tbl = 'tcm_formula_herb';
|
|
$this->herb_tbl = 'tcm_herb';
|
|
$this->collect_log_tbl = 'tcm_collect_log';
|
|
$this->formula_use_log_tbl = 'tcm_formula_use_log';
|
|
}
|
|
|
|
public function createCase($name, $source, $method, $herbs) {
|
|
if (empty($name)) {
|
|
$this->setError('药方名称不能为空');
|
|
return false;
|
|
}
|
|
if (empty($source)) {
|
|
$this->setError('药方来源不能为空');
|
|
return false;
|
|
}
|
|
if (empty($method)) {
|
|
$this->setError('药方用法不能为空');
|
|
return false;
|
|
}
|
|
if (empty($herbs)) {
|
|
$this->setError('药方药材不能为空');
|
|
return false;
|
|
}
|
|
|
|
//保存原方
|
|
$original = json_encode($herbs, JSON_UNESCAPED_UNICODE);
|
|
|
|
$id = $this->obj->insert($this->tbl, array('name' => $name, 'source' => $source, 'original' => $original, 'method' => $method));
|
|
if (!$id) {
|
|
$this->setError('添加失败');
|
|
return false;
|
|
}
|
|
|
|
//格式化药方对应的药材数据
|
|
$case_herb = $this->formatCaseHerb($id, $herbs);
|
|
//创建药方对应的药材
|
|
$this->createCaseHerb($case_herb);
|
|
|
|
return $id;
|
|
}
|
|
|
|
public function updateCase($id, $name, $source, $original, $method, $herbs) {
|
|
if (empty($herbs)) {
|
|
$this->setError('药方药材不能为空');
|
|
return false;
|
|
}
|
|
|
|
$data = array();
|
|
if (!empty($name)) $data['name'] = $name;
|
|
if (!empty($source)) $data['source'] = $source;
|
|
if (!empty($original)) $data['original'] = $original;
|
|
if (!empty($method)) $data['method'] = $method;
|
|
|
|
$res = $this->obj->update($this->tbl, $data, array('sql' => '`id`=?', 'vals' => array($id)));
|
|
if (!$res) {
|
|
$this->setError('更新失败');
|
|
return false;
|
|
}
|
|
|
|
//格式化药方对应的药材数据
|
|
$case_herb = $this->formatCaseHerb($id, $herbs);
|
|
//更新药方对应的药材
|
|
$this->compareCaseHerb($id, $case_herb);
|
|
|
|
return true;
|
|
}
|
|
|
|
public function formatCaseHerb($formula_id, $herbs) {
|
|
$case_herb = array();
|
|
foreach ($herbs as $key => $item) {
|
|
$temp = array();
|
|
$temp['name'] = $item['name'];
|
|
$temp['formula_id'] = $formula_id;
|
|
$temp['num'] = $this->convertToNum('汉', $item['num'], $item['name']);
|
|
$temp['sort'] = $key;
|
|
|
|
$herb = $this->getHerbByName($item['name']);
|
|
if ($herb) {
|
|
$temp['herb_id'] = $herb['id'];
|
|
} else {
|
|
$temp['herb_id'] = $this->createHerb(array('name' => $item['name'], 'desc' => $item['desc']));
|
|
}
|
|
$case_herb[] = $temp;
|
|
}
|
|
|
|
return $case_herb;
|
|
}
|
|
|
|
public function convertToNum($from, $str, $herb_name) {
|
|
$num_list = $GLOBALS['num_list'];
|
|
$num_list_arr = array_merge(array_keys($GLOBALS['num_list']['num']), array_keys($GLOBALS['num_list']['unit']));
|
|
$weight_list = $GLOBALS['weight_list'][$from];
|
|
$weight_list_arr = array_keys($GLOBALS['weight_list'][$from]);
|
|
|
|
$unit = str_replace($num_list_arr, '', $str);
|
|
$weight = isset($weight_list[$unit]) ? $weight_list[$unit] : 0;
|
|
if (isset($weight[$herb_name])) $weight = $weight[$herb_name];
|
|
|
|
$num = 0;
|
|
$temp = 0;
|
|
|
|
$num_str = str_replace($weight_list_arr, '', $str);
|
|
$length = mb_strlen($num_str);
|
|
for ($i = 0; $i < $length; $i++) {
|
|
$char = mb_substr($num_str, $i, 1);
|
|
|
|
if (isset($num_list['num'][$char])) {
|
|
$temp = $num_list['num'][$char];
|
|
} elseif (isset($num_list['unit'][$char])) {
|
|
$temp = ($temp == 0 ? 1 : $temp) * $num_list['unit'][$char];
|
|
$num += $temp; // 将临时结果累加到最终结果中
|
|
$temp = 0; // 重置临时结果
|
|
}
|
|
}
|
|
|
|
$num += $temp;
|
|
|
|
return $num * $weight;
|
|
}
|
|
|
|
public function getHerbByName($name) {
|
|
return $this->obj->select($this->herb_tbl, array('sql' => '`name`=?', 'vals' => array($name)));
|
|
}
|
|
|
|
public function createHerb($info) {
|
|
$herb_id = $this->obj->insert($this->herb_tbl, $info);
|
|
if (empty($herb_id)) {
|
|
$this->setError('添加药材失败');
|
|
return false;
|
|
}
|
|
|
|
return $herb_id;
|
|
}
|
|
|
|
public function createCaseHerb($info) {
|
|
$res = $this->obj->mutiInsert($this->formula_herb_tbl, $info);
|
|
if (!$res) {
|
|
$this->setError('添加药方药材失败');
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function compareCaseHerb($id, $new_data) {
|
|
$old_data = $this->getFormulaHerb($id);
|
|
|
|
$old_num = count($old_data);
|
|
$new_num = count($new_data);
|
|
|
|
if ($old_num >= $new_num) {
|
|
//需要删除药方对应的药材
|
|
foreach ($old_data as $key => $value) {
|
|
if (!isset($new_data[$key])) {
|
|
$res = $this->obj->delete($this->formula_herb_tbl, array('sql' => '`id`=?', 'vals' => array($value['id'])));
|
|
if (!$res) {
|
|
$this->setError('删除药方药材失败');
|
|
return false;
|
|
}
|
|
}
|
|
$res = $this->obj->update($this->formula_herb_tbl, $new_data[$key], array('sql' => '`id`=?', 'vals' => array($value['id'])));
|
|
if (!$res) {
|
|
$this->setError('更新药方药材失败');
|
|
return false;
|
|
}
|
|
}
|
|
} else {
|
|
//需要增加药方对应的药材
|
|
foreach ($new_data as $key => $value) {
|
|
if (!isset($old_data[$key])) {
|
|
$res = $this->obj->insert($this->formula_herb_tbl, $value);
|
|
if (!$res) {
|
|
$this->setError('添加药方药材失败');
|
|
return false;
|
|
}
|
|
}
|
|
$res = $this->obj->update($this->formula_herb_tbl, $value, array('sql' => '`id`=?', 'vals' => array($old_data[$key]['id'])));
|
|
if (!$res) {
|
|
$this->setError('更新药方药材失败');
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function getFormulaHerb($formula_id) {
|
|
return $this->obj->selectAll($this->formula_herb_tbl, array('sql' => '`formula_id`=?', 'vals' => array($formula_id)), 'sort asc ');
|
|
}
|
|
|
|
public function getFormulaHerbs($formula_ids) {
|
|
$data = $this->obj->selectIn($this->formula_herb_tbl, array('formula_id' => $formula_ids));
|
|
if (empty($data)) return array();
|
|
return array_column($data, null, 'id');
|
|
}
|
|
|
|
public function getFormulaByName($uid, $page_num, $page_size, $name) {
|
|
$offset = ($page_num - 1) * $page_size;
|
|
|
|
$where = "s.uid in (0,{$uid})";
|
|
if ($name) {
|
|
$where .= " and s.`name` like '%{$name}%'";
|
|
}
|
|
|
|
$sql = "select s.id,s.uid,s.name,s.source,s.original,s.method,u.use_num,s.sort from {$this->tbl} as s left join {$this->formula_use_log_tbl} as u on s.id=u.formula_id where {$where} order by u.use_num desc,s.sort desc limit {$offset},{$page_size}";
|
|
return $this->obj->execute($sql, true, true);
|
|
}
|
|
|
|
public function getFormulaList($uid, $page_num, $page_size, $name) {
|
|
$data = $this->getFormulaByName($uid, $page_num, $page_size, $name);
|
|
|
|
$formula_ids = array_column($data, 'id');
|
|
|
|
$formula_arr = $this->getFormulaHerbData($formula_ids);
|
|
|
|
foreach ($data as &$da) {
|
|
if (isset($formula_arr[$da['id']])) {
|
|
$da['formula'] = $formula_arr[$da['id']];
|
|
}
|
|
|
|
if (!empty($da['original'])) {
|
|
$original = json_decode($da['original'], true);
|
|
$original = array_column($original, null, 'name');
|
|
|
|
foreach ($da['formula'] as &$v) {
|
|
if (isset($original[$v['name']])) {
|
|
$v['num'] = $original[$v['name']]['num'];
|
|
$v['desc'] = $original[$v['name']]['desc'];
|
|
}
|
|
}
|
|
}
|
|
|
|
unset($da['original']);
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function getFormulaHerbData($formula_ids) {
|
|
$formula_herbs = $this->getFormulaHerbs($formula_ids);
|
|
|
|
$herb_ids = array_column($formula_herbs, 'herb_id');
|
|
$herbs = $this->getHerbs($herb_ids);
|
|
$herb_arr = array_column($herbs, null, 'id');
|
|
|
|
$formula_arr = array();
|
|
foreach ($formula_herbs as $formula_herb) {
|
|
$temp = array(
|
|
'id' => $formula_herb['herb_id'],
|
|
'name' => '',
|
|
'num' => $formula_herb['num'],
|
|
'desc' => $formula_herb['desc'],
|
|
);
|
|
|
|
if (isset($herb_arr[$formula_herb['herb_id']])) {
|
|
$temp['name'] = $herb_arr[$formula_herb['herb_id']]['name'];
|
|
}
|
|
|
|
$formula_arr[$formula_herb['formula_id']][] = $temp;
|
|
}
|
|
return $formula_arr;
|
|
}
|
|
|
|
public function getFormulaTotal($uid, $name) {
|
|
$sql = "select count(*) as count from $this->tbl where uid in (0,{$uid})";
|
|
if ($name) {
|
|
$sql .= " and `name` like '%{$name}%'";
|
|
}
|
|
$res = $this->obj->execute($sql, true, true);
|
|
$num = $res[0]['count'];
|
|
|
|
return $num;
|
|
}
|
|
|
|
public function getFormulaInfo($id, $uid = 0) {
|
|
//药方信息
|
|
$formula = $this->getFormulaById($id);
|
|
if (empty($formula)) {
|
|
$this->setError('查询不到此药方');
|
|
return false;
|
|
}
|
|
|
|
if ($uid > 0 && $formula['uid'] != $uid) {
|
|
$this->setError('这不是你的药方');
|
|
return false;
|
|
}
|
|
|
|
$formula['formula'] = $this->getFormulaHerbData($formula['id'])[$formula['id']];
|
|
|
|
if (!empty($formula['original'])) {
|
|
$original = json_decode($formula['original'], true);
|
|
$original = array_column($original, null, 'name');
|
|
|
|
foreach ($formula['formula'] as &$v) {
|
|
if (isset($original[$v['name']])) {
|
|
$v['num'] = (float)$original[$v['name']]['num'];
|
|
$v['desc'] = $original[$v['name']]['desc'];
|
|
}
|
|
}
|
|
}
|
|
|
|
unset($formula['original']);
|
|
|
|
return $formula;
|
|
}
|
|
|
|
public function getFormulaById($id) {
|
|
return $this->obj->select($this->tbl, array('sql' => '`id`=?', 'vals' => array($id)));
|
|
}
|
|
|
|
public function getHerbs($ids) {
|
|
return $this->obj->selectIn($this->herb_tbl, array('id' => $ids));
|
|
}
|
|
|
|
public function getFormulaByIds($ids) {
|
|
return $this->obj->selectIn($this->tbl, array('id' => $ids));
|
|
}
|
|
|
|
public function updateCaseUseLog($uid, $formula_id) {
|
|
$res = $this->obj->increase($this->formula_use_log_tbl, array('sql' => '`uid`=? and `formula_id`=?', 'vals' => array($uid, $formula_id)), 'use_num');
|
|
if (!$res) {
|
|
$tool_obj = new qTool();
|
|
$tool_obj->trackLog('tcm', $uid . "|" . $formula_id, sprintf(LOG_TRACK_SAVE_PATH, date('Y-m-d'), 'tcm_formula_use_log'));
|
|
|
|
$this->setError('药方使用次数更新失败');
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function getCollectLog($page_num, $page_size) {
|
|
$offset = ($page_num - 1) * $page_size;
|
|
return $this->obj->selectAll($this->collect_log_tbl, array(), 'collect_time desc ', array($offset, $page_size));
|
|
}
|
|
|
|
public function getCollectLogTotal() {
|
|
return $this->obj->count($this->collect_log_tbl);
|
|
}
|
|
|
|
}
|