<?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 searchFormulaList($condition, $page_num, $page_size) {
$offset = ($page_num - 1) * $page_size;
$uid = 0;
$where = "1=1";
if (!empty($condition)) {
foreach ($condition as $key => $val) {
if ($key == 'name') {
$where .= " and s.{$key} like '%{$val}%'";
} elseif ($key == 'uid') {
$uid = $val;
$where .= " and s.{$key} in (0,{$val})";
} elseif (is_array($val)) {
$val = implode(',', $val);
$where .= " and s.{$key} in ({$val})";
} else {
$where .= " and s.{$key}={$val}";
}
}
}
$sql = "select s.*,COALESCE(u.use_num, 0) AS use_num from {$this->tbl} as s left join {$this->formula_use_log_tbl} as u on s.id=u.formula_id and u.uid={$uid} where {$where} group by s.id order by use_num desc,s.sort desc,s.id desc limit {$offset},{$page_size}";
$data = $this->obj->execute($sql, true, true);
$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_str'] = $original[$v['name']]['num'];
$v['desc'] = $original[$v['name']]['desc'];
}
}
}
unset($da['original']);
}
return $data;
}
public function searchFormulaTotal($condition) {
$where = "1=1";
if (!empty($condition)) {
foreach ($condition as $key => $val) {
if ($key == 'name') {
$where .= " and {$key} like '%{$val}%'";
} elseif ($key == 'uid') {
$where .= " and {$key} in (0,{$val})";
} elseif (is_array($val)) {
$val = implode(',', $val);
$where .= " and {$key} in ({$val})";
} else {
$where .= " and {$key}={$val}";
}
}
}
$sql = "select count(*) as count from $this->tbl where {$where}";
$res = $this->obj->execute($sql, true, true);
$num = $res[0]['count'];
return $num;
}
public function getUserFormulaList($condition, $page_num, $page_size) {
$offset = ($page_num - 1) * $page_size;
$uid = 0;
$where = "1=1";
if (!empty($condition)) {
foreach ($condition as $key => $val) {
if ($key == 'uid') $uid = $val;
if ($key == 'name') {
$where .= " and s.{$key} like '%{$val}%'";
} elseif (is_array($val)) {
$val = implode(',', $val);
$where .= " and s.{$key} in ({$val})";
} else {
$where .= " and s.{$key}={$val}";
}
}
}
$sql = "select s.*,COALESCE(u.use_num, 0) AS use_num from {$this->tbl} as s left join {$this->formula_use_log_tbl} as u on s.id=u.formula_id and u.uid={$uid} where {$where} group by s.id order by use_num desc,s.sort desc,s.id desc limit {$offset},{$page_size}";
return $this->obj->execute($sql, true, true);
}
public function getUserFormulaTotal($condition) {
$where = "1=1";
if (!empty($condition)) {
foreach ($condition as $key => $val) {
if ($key == 'name') {
$where .= " and {$key} like '%{$val}%'";
} elseif (is_array($val)) {
$val = implode(',', $val);
$where .= " and {$key} in ({$val})";
} else {
$where .= " and {$key}={$val}";
}
}
}
$sql = "select count(*) as count from $this->tbl where {$where}";
$res = $this->obj->execute($sql, true, true);
$num = $res[0]['count'];
return $num;
}
public function getFormulaList($condition, $page_num, $page_size) {
$offset = ($page_num - 1) * $page_size;
$where = "1=1 ";
if (!empty($condition)) {
foreach ($condition as $key => $val) {
if ($key == 'name') {
$where .= " and {$key} like '%{$val}%'";
} elseif (is_array($val)) {
$val = implode(',', $val);
$where .= " and {$key} in ({$val})";
} else {
$where .= " and {$key}={$val}";
}
}
}
$data = $this->obj->selectAll($this->tbl, array('sql' => $where, 'vals' => array()), 'id desc ', array($offset, $page_size));
$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_str'] = $original[$v['name']]['num'];
$v['desc'] = $original[$v['name']]['desc'];
}
}
}
unset($da['original']);
}
return $data;
}
public function getFormulaTotal($condition) {
$where = "1=1 ";
if (!empty($condition)) {
foreach ($condition as $key => $val) {
if ($key == 'name') {
$where .= " and {$key} like '%{$val}%'";
} elseif (is_array($val)) {
$val = implode(',', $val);
$where .= " and {$key} in ({$val})";
} else {
$where .= " and {$key}={$val}";
}
}
}
return $this->obj->count($this->tbl, array('sql' => $where, 'vals' => array()));
}
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 getFormulasHerb($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 getFormulaHerbData($formula_ids) {
$formula_herbs = $this->getFormulasHerb($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) {
$formula_arr[$formula_herb['formula_id']][] = array(
'id' => $formula_herb['herb_id'],
'name' => $herb_arr[$formula_herb['herb_id']]['name'],
'num' => $formula_herb['num'],
//'desc' => $formula_herb['desc'],
'num_str' => $formula_herb['num'] . 'g',
);
}
return $formula_arr;
}
public function getFormulaInfo($id, $uid) {
//药方信息
$formula = $this->getFormulaById($id);
if (empty($formula)) {
$this->setError('抱歉,未找到匹配的药方');
return false;
}
//自拟药方 判断药方归属
if ($uid > 0 & & $formula['uid'] > 0 & & $formula['uid'] != $uid) {
$this->setError('抱歉,这不是你的药方');
return false;
}
//获取药方药材信息
$formula_arr = $this->getFormulaHerbData(array($formula['id']));
$formulaHerb = $formula_arr[$formula['id']];
$original = $formula['original'];
unset($formula['original']);
if (empty($original)) {
$formula['formula'] = $formulaHerb;
return $formula;
}
//原方信息
$original = json_decode($original, true);
$original = array_column($original, null, 'name');
foreach ($formulaHerb as & $v) {
if (isset($original[$v['name']])) {
$v['num_str'] = $original[$v['name']]['num'];
$v['desc'] = $original[$v['name']]['desc'];
}
}
$formula['formula'] = $formulaHerb;
return $formula;
}
public function convertToNum($herb_name, $str, $onlyconertNum = true, $from = '汉') {
$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]);
//计量数字
$num_str = str_replace($weight_list_arr, '', $str);
//计量单位
$unit = str_replace($num_list_arr, '', $str);
//计量单位
$unit = str_replace($num_str, '', $unit);
//非数字转换
$num = $num_str;
if (!is_numeric($num) & & $num) {
$num = 0;
$temp = 0;
$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;
}
//只将汉字数字转换成number
if ($onlyconertNum) {
return $num . $unit;
}
//单位换算 直接换算成克数
$weight = isset($weight_list[$unit]) ? $weight_list[$unit] : 0;
if (isset($weight[$herb_name])) $weight = $weight[$herb_name];
if (!is_numeric($weight)) $weight = 0;
return $num * $weight;
}
public function getHerb($name) {
return $this->obj->select($this->herb_tbl, array('sql' => '`name`=?', 'vals' => array($name)));
}
public function insertHerb($info) {
$herb_id = $this->obj->insert($this->herb_tbl, $info);
if (!$herb_id) {
$this->writeLog('formula', 'save_error_log', '添加药材失败|' . json_encode($info));
return false;
}
return $herb_id;
}
public function dealForulaHerb($uid, $herbs) {
$formula_herb = array();
$herb_ids = array();
foreach ($herbs as $key => $item) {
$name = trim($item['name']);
$num = trim($item['num']);
$desc = trim($item['desc']);
//自拟药方 克重不能为0
if ($uid > 0 & & $num == 0) {
$this->setError("抱歉,药材{$name}重量不能为零");
return false;
}
$temp = array();
//格式化药材id
$herb = $this->getHerb($name);
if ($herb) {
$temp['herb_id'] = $herb['id'];
} else {
$temp['herb_id'] = $this->insertHerb(array('uid' => $uid, 'name' => $name, 'desc' => $desc));
if (!$temp['herb_id']) {
$this->setError('添加药材失败');
return false;
}
}
if (isset($herb_ids[$temp['herb_id']])) {
$this->setError("抱歉,药方中存在重复的药材");
return false;
}
$herb_ids[$temp['herb_id']] = $temp['herb_id'];
//录药方上传的原方需要 单位换算
$temp['num'] = $num;
if ($uid == 0) {
//目前先不换算 默认为0 使用原方用量
$temp['num'] = 0;
//$temp['num'] = $this->convertToNum($name, $num, false);
}
$temp['sort'] = $key;
$formula_herb[] = $temp;
}
return $formula_herb;
}
public function insertFormula($info) {
$id = $this->obj->insert($this->tbl, $info);
if (empty($id)) {
$this->writeLog('formula', 'save_error_log', '添加药方失败|' . json_encode($info, JSON_UNESCAPED_UNICODE));
return false;
}
return $id;
}
public function insertFormulaHerb($info) {
$res = $this->obj->mutiInsert($this->formula_herb_tbl, $info);
if (!$res) {
$this->writeLog('formula', 'save_error_log', '批量添加药方药材关联失败|' . json_encode($info, JSON_UNESCAPED_UNICODE));
return false;
}
return true;
}
public function updateFormula($id, $info) {
$res = $this->obj->update($this->tbl, $info, array('sql' => '`id`=?', 'vals' => array($id)));
if (!$res) {
$this->writeLog('formula', 'save_error_log', '更新药方失败|' . $id . '|' . json_encode($info, JSON_UNESCAPED_UNICODE));
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 mutiUpdateFormulaHerb($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->writeLog('formula', 'save_error_log', '删除药方药材关联失败|' . $value['id']);
return false;
}
continue;
}
$res = $this->obj->update($this->formula_herb_tbl, $new_data[$key], array('sql' => '`id`=?', 'vals' => array($value['id'])));
if (!$res) {
$this->writeLog('formula', 'save_error_log', '更新药方药材关联失败1|' . $value['id'] . '|' . json_encode($new_data[$key], JSON_UNESCAPED_UNICODE));
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->writeLog('formula', 'save_error_log', '添加药方药材关联失败|' . $value['id']);
return false;
}
continue;
}
$res = $this->obj->update($this->formula_herb_tbl, $value, array('sql' => '`id`=?', 'vals' => array($old_data[$key]['id'])));
if (!$res) {
$this->writeLog('formula', 'save_error_log', '更新药方药材关联失败2|' . $value['id'] . '|' . json_encode($new_data[$key], JSON_UNESCAPED_UNICODE));
return false;
}
}
}
return true;
}
public function saveFormula($uid, $id, $name, $source, $method, $herbs) {
if (empty($name)) {
$this->setError('请填写药方名称');
return false;
}
$herbs = json_decode($herbs, true);
if (empty($herbs)) {
$this->setError('请填写药方详情');
return false;
}
if ($id) {
$formula = $this->getFormulaById($id);
if (empty($formula)) {
$this->setError('抱歉,未找到匹配的药方');
return false;
}
if ($formula['uid'] != $uid) {
$this->setError('抱歉,这不是你的药方');
return false;
}
}
$data = array(
'uid' => $uid,
'name' => $name,
'source' => $source,
);
//$uid为0 即为后台录入药方 需处理原方数据
if ($uid == 0) {
$org_herb = array();
foreach ($herbs as $key => $herb) {
$org_herb[$key] = array(
'name' => trim($herb['name']),
'num' => $this->convertToNum(trim($herb['name']), trim($herb['num'])),
'desc' => trim($herb['desc']),
);
}
//更新原方和用法
$data['original'] = json_encode($org_herb, JSON_UNESCAPED_UNICODE);
$data['method'] = $method;
$data['is_delete'] = 2;
}
//格式化药方对应的药材数据
$formula_herb = $this->dealForulaHerb($uid, $herbs);
if (!$formula_herb) {
$this->writeLog('formula', 'save_error_log', '药方药材初始化失败|' . $uid . '|' . json_encode($herbs, JSON_UNESCAPED_UNICODE));
return false;
}
if (!$id) {
//添加药方 并添加药方药材关联关系
$id = $this->insertFormula($data);
if (!$id) {
$this->setError('添加药材失败');
return false;
}
//创建药方对应的药材
foreach ($formula_herb as & $item) {
$item['formula_id'] = $id;
}
$res = $this->insertFormulaHerb($formula_herb);
if (!$res) {
$this->setError('添加药方详情失败');
return false;
}
} else {
//更新药方 并更新药方药材关联关系
$res = $this->updateFormula($id, $data);
if (!$res) {
$this->setError('更新药方失败');
return false;
}
//批量更新药方药材关联关系
foreach ($formula_herb as & $item) {
$item['formula_id'] = $id;
}
$res = $this->mutiUpdateFormulaHerb($id, $formula_herb);
if (!$res) {
$this->setError('更新药方详情失败');
return false;
}
}
return $id;
}
public function deleteFormula($uid, $id, $is_delete) {
$formula = $this->getFormulaById($id);
if (empty($formula)) {
$this->setError('抱歉,未找到匹配的药方');
return false;
}
if ($formula['uid'] != $uid) {
$this->setError('抱歉,这不是你的药方');
return false;
}
$res = $this->updateFormula($id, array('is_delete' => $is_delete));
if (!$res) {
$this->setError('删除药方失败');
return false;
}
return true;
}
public function getHerbById($id) {
return $this->obj->select($this->herb_tbl, array('sql' => '`id`=?', 'vals' => array($id)));
}
public function getFormulaByIds($ids) {
return $this->obj->selectIn($this->tbl, array('id' => $ids));
}
public function updateFormulaUseLog($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) {
$this->writeLog('formula', 'update_error_log', '药方使用次数更新失败|' . $uid . '|' . $formula_id);
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);
}
}