數據庫字段設計
商品表
CREATE TABLE `rht_dealer_order_goods` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`pid` int(11) DEFAULT NULL COMMENT '訂單id',
`goods_id` int(11) DEFAULT '0' COMMENT '商品id',
`goods_no` varchar(50) DEFAULT '' COMMENT '商品貨號',
`pro_spec` varchar(255) DEFAULT '' COMMENT '商品規格',
`pro_name` varchar(100) DEFAULT NULL COMMENT '商品名稱',
`unit` varchar(20) DEFAULT '' COMMENT '計量單位',
`carton_size` varchar(50) DEFAULT '' COMMENT '箱規',
`goods_num` int(11) DEFAULT NULL COMMENT '數量',
`supplier_cost` decimal(11,2) DEFAULT '0.00' COMMENT '供貨價',
`discount` decimal(11,2) DEFAULT '0.00' COMMENT '折扣比率',
`discount_amount` decimal(11,2) DEFAULT '0.00' COMMENT '折扣金額',
`is_del` tinyint(4) DEFAULT '0' COMMENT '是否刪除 0未刪除 1已刪除',
`create_time` int(11) DEFAULT NULL COMMENT '創建時間',
`update_time` int(11) DEFAULT NULL COMMENT '修改時間',
`create_time_auto` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '自動創建時間 CURRENT_TIMESTAMP',
`update_time_auto` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '自動修改時間 CURRENT_TIMESTAMP',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=580 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
日誌記錄表
CREATE TABLE `rht_dealer_order_log` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`pid` bigint(20) DEFAULT NULL COMMENT '關聯表id',
`audit_id` bigint(20) DEFAULT NULL COMMENT '審覈人id',
`audit_name` varchar(100) DEFAULT NULL COMMENT '審覈人名稱',
`operation_log` text COMMENT '操作內容記錄表',
`back_id` int(11) DEFAULT NULL COMMENT '駁回指定人id',
`create_time` int(11) DEFAULT NULL COMMENT '創建時間,時間戳格式',
`update_time` int(11) DEFAULT NULL COMMENT '修改時間 時間戳格式',
`create_time_auto` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '自動創建時間',
`update_time_auto` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '自動修改時間',
`step` int(11) DEFAULT NULL COMMENT '[100-200 審覈記錄步驟][200-300 抄送記錄步驟][300-400 集團流程步驟]',
`is_result` int(11) DEFAULT '0' COMMENT '審覈結果 0未審批 1同意 2拒絕',
`is_read` tinyint(4) DEFAULT '0' COMMENT '是否已讀 0未讀 1已讀',
`comment` varchar(255) DEFAULT '' COMMENT '審覈意見',
`is_del` tinyint(4) DEFAULT '0' COMMENT '是否刪除 0否 1是',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
修改記錄的邏輯代碼
/**
* 比對數據
* @param $dealer_order_old array() 原訂單數據
* @param $dealer_order_new array() 新訂單數據
* @param $goods_old array() 原商品數據
* @param $goods_new array() 新商品數據
*
* @return array
*/
protected function comparisonData($dealer_order_old,$dealer_order_new,$goods_old,$goods_new)
{
unset($dealer_order_new['open']);
unset($dealer_order_new['progress_bar']);
unset($dealer_order_new['audit_time']);
unset($dealer_order_new['update_time']);
unset($dealer_order_new['create_time']);
//記錄修改字符
$operation_log = array();
$dealer_order_fields =$this->table_fields('rht_dealer_order')['data']['list'];
$goods_fields = $this->table_fields('rht_dealer_order_goods')['data']['list'];
//訂單新老數據比對
foreach ($dealer_order_new as $key => $value){
if($value != $dealer_order_old[$key]){
$operation_log[] = '['.$dealer_order_fields[$key]. ']由['.$dealer_order_old[$key].']修改爲['.$value.']';
}
}
//商品新老數據比對
if(empty($goods_old))
{
return ['code'=>0,'info'=>'該訂單沒有商品'];
}
//這段感覺多餘了
if(empty($goods_new))
{
return ['code'=>1,'info'=>'訂單數據比對成功','data'=>['operation_log'=>json_encode($operation_log,JSON_UNESCAPED_UNICODE),'goods_del'=>array(),'goods_update'=>array()]];
}
//array_column 取出某列值作爲數組鍵名
$goods_arr = array_column($goods_old,null,'id');
$goods_new_arr = array_column($goods_new,null,'goods_id');
$goods_update = array();
$goods_del = array();
//商品修改記錄
foreach ($goods_arr as $k =>$v)
{
if(!isset($goods_new_arr[$k]))//判斷是否被刪除
{
$operation_log[$v['goods_no']][] = '商品['.$v['pro_name'].']被刪除';
$goods_del[] = $v['id'];
}else{
$str = '';
foreach($goods_new_arr[$k] as $ko =>$vo)
{
if($vo!=$v[$ko])
{
if(!in_array($v['id'],$goods_update))
{
array_push($goods_update,$v['id']);
}
$operation_log[$v['goods_no']][] = $str.'['.$goods_fields[$ko].']由['.$v[$ko].']修改爲['.$vo.']';
}
}
}
}
//整理商品修改數據
$goods_update_arr = array();
foreach ($goods_update as $v)
{
$row = $goods_new_arr[$v];
$row['update_time'] = time();
$goods_update_arr[] = $row;
}
return ['code'=>1,'info'=>'訂單數據比對成功','data'=>['operation_log'=>json_encode($operation_log,JSON_UNESCAPED_UNICODE),'goods_del'=>$goods_del,'goods_update'=>$goods_update_arr]];
}
/**
* 獲取數據表 字段名
* @param $table_name
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function table_fields($table_name)
{
$table = Db::name('information_schema.columns')->field('column_name,column_comment')->where('table_name',$table_name)->select();
foreach ($table as $v)
{
$arr[$v['column_name']] = $v['column_comment'];
}
return ['code'=>1,'info'=>'成功取出字段名','data'=>['list'=>$arr]];
}
展示界面數據獲取控制器代碼部分
$log_arr = Db::table('rht_dealer_order_log')->where('pid',$id)->where([['step','>',100],['step','<',200]])->select();
$follow = Db::table('rht_dealer_order_log')->where('pid',$id)->where([['step','>',300],['step','<',400]])->select();
if($log_arr){
$this->assign('follow',$follow);
$this->assign('result',$log_arr);
}else{
$result = array();
$this->assign($result);
}
展示界面數據獲取前端html代碼部分
<div id="log2" style="display: none;">
{empty name='result'}
<div>還沒有修改記錄!</div>
{else}
<ul class="layui-timeline">
{foreach $result as $key=>$vo} {php}$op = json_decode($vo['operation_log'],true);{/php}
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis">{if $key eq count($follow)-1}{else}{/if}</i>
<div class="layui-timeline-content layui-text">
<strong class="layui-timeline-title">{$vo.update_time_auto|default='--'}</strong>
<p>{$vo.audit_name|default='--'}</p>
<ul>
{if condition ="empty($op)"}
<li>無修改記錄</li>
{else} {foreach $op as $k =>$v} {if condition="is_numeric($k)"}
<li>{$v}</li>
{else}
<li>商品({$k})</li>
<ul>
{foreach $v as $kk =>$vk}
<li>{$vk}</li>
{/foreach}
</ul>
{/if} {/foreach} {/if}
</ul>
</div>
</li>
{/foreach} {foreach $follow as $key=>$vo} {php}$op = json_decode($vo['operation_log'],true);{/php}
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis">{if $key eq count($follow)-1}{else}{/if}</i>
<div class="layui-timeline-content layui-text">
<p>{$vo.audit_name|default='--'}</p>
</div>
</li>
{/foreach}
</ul>
{/empty}
</div>