数据库字段设计
商品表
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>