软件项目
2015-12-31 20:31
204 查看
FIFO重估
背景:更精准的反映公司盈利能力,实现精细化管理的需要,通过先进先出匹配数据实现
解释:
先进先出法的意思就是在计算生产成本的时候,原材料按照先进先出的原则入成本。比如说你库存的材料本来有100个,30个是一月的时候10块钱一个进的,40个是二月的时候15块钱一个进的,还有30个是你四月份20块钱一个进的货。这样子你的原材料总价值就是300 600 600=1500,均价15。
四月卖了50个单位的货物,价格是30快一个,消耗了50个单位的材料按照平均价格法你的当期毛利是50×30-50×15=750,但是按照先进先出法,你的成本就是30×10 20×15=600,毛利是900,显然,按照这个方法,物价上涨时期,销售额是高的,而用以计算的成本还是低价时期的,所以会导致利润高估。再看存货,按照平均价格法,你的材料剩余价值是15×50=750,而按照先进先出法,你的成本是1500-600=900,存货价值高估。
1.初始化:fifo_init_v2.sh
实时库存:正样残品 —>finance_inventory_stock_fifo
加权成本:期初 sku_month_cost=> sku_cost_day
存货汇总:finance_inventories_articulation 减去在途库存和金额
出入库:抓取前6个月的数据到新表中 warehouse_receipt_container warehouse_shipping_container
2.抓数据:ISFinanceFifoReceiptShippingCommand
单据:入库(加工入库 RMA\REJO\STI\SAI\TRK\JRK\RBR) 出库(加工出库 SO\SAO\PR\JCK\SAMPLE\SOD\STO\RBG\RBD\RBS) 采购(费用) 采退 调价 调拨出 调拨入 库存状态转换 盘盈盘亏
货主:TJ 自有商品非海淘化妆品 | BJ 非化妆品非海淘 | SHJM
出入库流水
finance_fifo_receipt_shipping_container 入库成本
3.匹配数据:ISFifoCommand
入库:
ASN\STRK\SAI\TRK\PY\JRK 直接将入库记录同时插入批次库存表和入库明细表即可
RMA\REJO\STI\ RBR 先去匹配其出库时的批次和货主,用出库时的批次和货主替换原记录,再插入批次库存表和入库明细表。异常就用入库的批次和货主,成本取期初,如果没有就取近似成本
出库:去匹配批次库存表中最早的一条数量不为0的入库记录,批次和货主分配给出库记录并插入出库明细,同时抵减批次库存表中对应数量;匹配不上的,进行虚拟盘盈(XNPY)的处理。将虚拟盘盈的批次和默认货主分配给异常数据,先在入库明细表中插入一条入库记录,再在出库明细表中插入一条出库记录。
处理出入库流水:
插入批次库存表 插入入库明细表 插入出库明细表(还要计算各种金额)
其他:近似成本 加工 出库匹配 入库批次和第二次入库特殊处理
调拨差异(在途库存)
a.出入库明细
finance_receipt_container 入库成本
finance_shipping_container 运费 结算价 加权成本
b.批次库存
finance_inventory_stock_fifo 存入库记录,用来出库时匹配批次和货主
finance_inventory_stock_fifo_ext RMA\REJO\STI\RBR入库对应的出库时的记录,
c.批次缓存
finance_inventory_stock_fifo_cache 相比上表多了一个时间,用来恢复数据
finance_inventory_stock_fifo_ext_cache 相比上表多了一个时间,用来恢复数据
4.计算数据
出入库流水的正品存货(合格 冻结)
上一期期初作为本期期末
出入库明细,入库(不算PA)为增加,出库(不算STD)为减少
计算加权成本*数量=正品存货汇总
--加权成本=期初金额 所有的入库金额/期初数量 所有的入库数量 (采购入库要匹配批次,加工包括合并和拆分)
—异常:分母是0 或 值为负数 就取该货主和SKU成本,如果还没有就取近似成本
—最后,加权成本写回出库明细表,入库明细表中更新调拨入库和虚拟盘盈的当期成本
期末正品在途库存数量 = 期初正品在途库存数量 – 本期正品调拨入库数量 本期正品调拨出库数量 – 本期正品调拨入残数量 – 本期正品调拨差异数量
5.镜像差异:
仓库镜像中正品数据(为基准) vs 财务批次库存正品数据
> 盘盈:插入入库明细和批次库存(先进先出),期末存货汇总增加
< 盘亏:插入出库明细,期末存货汇总减少
6.其他:
--金额
采退是先进先出,没按进价算
客退和拒收没匹配出库平均成本,而是采用期初平均成本
--归属
特殊 库存调整和加工货主是按照默认货主
领用与领用还回有状态不一致
--范围
没计入调价单
风控平台
背景:公司日常管理需要和每个季度的财审需求,通过对差异数据分析生成差异报告实现
一、结构功能图:
统计信息:
总览:差异条数 金额 以及 百分比 报警历史
分类:差异数据明细,统计时间 新增、修复和总计的金额/条数
趋势图:差异金额和条数的展示 趋势报表
分析信息:各业务线在指定时间段内的差异数据及其原因分析
订阅信息:
—业务类型和阀值(策略:每天 每周 总计 百分比 ==>金额与条数)超出了 ==>excel差异报告email给订阅人
—业务类型和订阅者
操作信息
业务信息
二、业务流程图(分析逻辑):抓取—>分析—>呈现—>分析—>呈现—>分析—>
抓取数据—> scan (业务逻辑 )
已分析过的差异数据统计—>统计信息发送—>web页面
未分析出原因的差异数据进行再次分析—>
差异数据
—>正常数据
—>差异数据
—>已明确差异原因数据
—>修复成正常数据并呈现
—>未明确差异原因数据
<--进行下一轮差异分析
三、数据字典
1.差异数据抓取表
wms vs jerp
采购核对 到货单 退货单
采购结算 到货单 vs 付款单 退货单 vs 收款单 结算单 vs 收款单/付款单
前端 vs wms
销售核对 销售出库 拒收入库 客退入库
销售结算 订单总优惠 订单总金额 商品优惠金额 用户流水
物流核对 前端订单 vs 物流
库存核对 wms vs jerp
关键时间段
FBJ
2.抓取分析器流程
扫描类
scanAbstract
mutliRun(多进程跑数)
—actionCheck(抽象类)
asnScan (./yiic asnScan multiRun)
actionCheck (具体实现类)
================================================================================
适配器类 (组合—>适配—>封装)
scanAnalyzeEngine
add(asnAnalyze) (扫描类通过分析器加载分析类)
rundata(asnAnalyze Check) (通过分析类对象实现数据分析过滤并写入)
================================================================================
分析类
analyzeAbstract
Curd(具体实现类)
—check (抽象类)
asnAnalyze
check(具体实现类)
================================================================================
复核类
revAbstract
-pending 是否有时间差异数据
review(issue pending) 实现
asnRev
uniqueKey
isPending
command 实例化所有的子review类,并调用父类的review方法,父类再调用analyze类去重新分析一轮
================================================================================
3.差异数据呈现表
主体:订阅表 业务负责人
业务:阀值表 业务数据 统计表 业务说明 操作历史
create database if not exists rice_state character set utf8 collate utf8_general_ci;
use rice_state;
CREATE TABLE `user_list` ( 订阅表
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件用户名',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '担任职务',
`description` varchar(255) NOT NULL DEFAULT '' COMMENT '说明该用户负责什么业务等一些附加信息',
`sms_number` varchar(32) NOT NULL DEFAULT '' COMMENT '接收短信的手机号',
`email_address` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件地址',
`sms_state` char(1) NOT NULL DEFAULT 'Y' COMMENT '是否允许接收sms',
`mail_state` char(1) NOT NULL DEFAULT 'Y' COMMENT '是否允许接收mail',
`create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`update_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8
CREATE TABLE `statistics_info` ( 统计表
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`biz_item` varchar(24) NOT NULL DEFAULT '' COMMENT '业务名',
`biz_category` varchar(255) not null default '' comment '业务分类',
`statistics_way` varchar(24) NOT NULL DEFAULT '' COMMENT '统计类型daily/hourly/weekly/monthly',
`statistics_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '统计时间点',
`fixed_count` int(11) NOT NULL DEFAULT '0' COMMENT '当期修复的差异数据数',
`added_count` int(11) NOT NULL DEFAULT '0' COMMENT '当期增加的差异数据数',
`total_count` int(11) NOT NULL DEFAULT '0' COMMENT '总的差异数据数',
`fixed_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当期修复的差异数据影响金额',
`added_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当期增加的差异数据影响金额',
`total_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '差异数据影响总金额',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_biz_item_way_time` (`biz_item`,`statistics_way`,`statistics_time`)
) ENGINE=InnoDB AUTO_INCREMENT=3000 DEFAULT CHARSET=utf8
CREATE TABLE `alarm_acl_policy` ( 阀值表
`alarm_id` int(11) NOT NULL AUTO_INCREMENT,
`biz_category` varchar(255) NOT NULL DEFAULT '' COMMENT '业务分类',
`rule` varchar(12) NOT NULL DEFAULT '' COMMENT '报警规则 如: rldw',
`r_ratio` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '比率:该次差异总金额与上次差异总金额的比率 0.00',
`l_limit` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '限制金额:当期增加的差异金额超过限额即报警 0.00',
`d_day` char(1) NOT NULL DEFAULT '' COMMENT '当天只要有新增加的差异数据就报警,根据daily的统计 Y/N',
`w_week` char(1) NOT NULL DEFAULT '' COMMENT '当周只要有新增加的差异数据就报警,根据weekly的统计 Y/N',
`from` varchar(255) DEFAULT NULL COMMENT 'alarm发送者地址',
`subject` varchar(8000) DEFAULT NULL COMMENT 'alarm标题',
`body` varchar(8000) DEFAULT NULL COMMENT 'alarm内容',
`create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`update_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`alarm_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
CREATE TABLE `alarm_user_map` ( 业务负责人
`id` int(11) NOT NULL AUTO_INCREMENT,
`alarm_id` varchar(255) NOT NULL DEFAULT '',
`user_id` varchar(255) NOT NULL DEFAULT '',
`user_name` varchar(255) NOT NULL comment '负责人姓名',
`state` varchar(255) NOT NULL DEFAULT 'Y',
`attach_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
create table `business_data_container` ( 业务数据
`id` int(11) not null auto_increment,
`biz_item` varchar(24) not null default '' comment '业务名',
`status` varchar(24) not null default '' comment '分析状态 new normal pending issue fixed',
`content` varchar(8000) not null default '' comment '差异数据详情(对应于business_list.columns)',
`amount` decimal(10,2) not null default '0.00' comment '影响金额',
`create_time` datetime not null default '0000-00-00 00:00:00',
`update_time` datetime not null default '0000-00-00 00:00:00',
primary key (`id`),
key `idx_create_time` (`create_time`)
) engine=InnoDB default charset=utf8 auto_increment=1;
CREATE TABLE `business_list` ( 业务说明
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`biz_item` varchar(24) NOT NULL DEFAULT '' COMMENT '业务名,全局唯一',
`biz_label` varchar(255) NOT NULL DEFAULT '' COMMENT '业务标签',
`biz_category` varchar(24) NOT NULL DEFAULT '' COMMENT '业务分类',
`description` varchar(8000) NOT NULL DEFAULT '' COMMENT '简单描述该业务的validate逻辑',
`columns` varchar(1024) NOT NULL DEFAULT '' COMMENT '该业务差异数据需要展现的列名(给审计报告的那种格式,根据业务需求来)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_biz_item` (`biz_item`),
KEY `idx_biz_category` (`biz_category`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8
create table alarm_history ( 操作历史
`id` int(11) unsigned not null auto_increment,
`alarm_id` varchar(255) not null default '' comment '某类业务某种发送方式的alarm',
`user_list` varchar(255) not null default '' comment '已经发送alarm的负责人List',
`content` varchar(255) not null default '' comment '发送内容',
`sent_time` datetime not null default '0000-00-00 00:00:00' comment '发送时间',
primary key (`id`)
) engine=InnoDB default charset=utf8 auto_increment=1;
跑数平台
背景:工作效率和数据安全需要,通过 yiic 脚本名 方法名 —参数1 —参数2 跑数实现
--数据抓取
父子进程共享代码空间,独享数据空间,
$pid = pcntl_fork(); //在当前进程当前位置产生分支(子进程)。
pcntl_fork();//创建子进程
if($pid<0){
//start //创建子进程失败
}else if($pid>0){
//parent id 父进程读取
}else{
//child implement //子进程读取
}
为了防止子进程成为僵尸进程,子进程执行后要返回给父进程一个信号量,父进程通过wait释放子进程所占用的资源,最后销毁父进程和没来的急处理的子进程记录
pcntl_signal(SIGCHLD, array($this, "childSignalHandler")); //信号量用来防止生成僵尸进程
包含下面:
$exitCode = pcntl_wexitstatus($status); //回收中断的子进程
$pid = pcntl_waitpid(-1, $status, WNOHANG); //回收已完成的子进程
unset($this->currentJobs[$pid]);//删除进程
unset($this->signalQueue[$pid]);;//删除子进程的信息记录
系统调用方法:
system() 赋值给变量就输出所有,第二个参数回最后一行。
exec() 赋值给变量后返回最后一行,第二个参数可通过数组获取所有返回结果。
shell_exec() 赋值给变量后输出所有结果
--数据校验
1)DWAbstractCommand: 数据模型抽象类
importData ClearDataAll ClearDataByDateSpan
2)DWPopAbstract:ETL抽象类继承DWAbstract
源表 目标表 差异表,相当于增量数据备份
对比源表和目标表的某个时间段内(递归找到某个时间段)的差异数据,包括数据字段(column)和数据(serialize),将差异数据汇总到到差异表中,然后与目标数据对比并修复
来源库和表 目标库和表
存在差异的数据量 当前插入的数据量
来源表数据和sum数据 目标表的数据和sum数 条数
3)表源数据抓取:具体实现类DWAbstractCommand.php继承DWPopAbstract:ETL
清除目标表数据
获取目标表数据 检测目标表sum
获取来源表数据 条数 检车来源表sum
4)差异数据记录PopDiffLog
修复标记 导入差异数据 字段和表数据验证 是否需要插入 删除和更新
--数据展示
接口:任务开始 任务执行状态(任务列表 详细) 任务结束
每分钟执行一次,进程不存在启动,初始化状态和报告信息,查找审核通过的任务执行(根据任务ID加载任务,传参并执行addRun),
轮询定时任务,检查已通过审核的任务,然后检查时效,如果已通过审核且已到期就加入任务列表准备执行
一、功能结构图:
新建任务:临时任务 定时任务
审核任务:通过 未通过
订阅任务:异常 输出 报告
统计任务:总计执行 异常 正常
操作日志:执行记录
二、业务流程图:
新建—>临时任务—>任务列表—>审核通过—>执行任务—>发送邮件
—>定时任务—>检查时间—>任务列表
三、数据字典:定时 临时 明细 订阅 统计 日志
主体:申请人 审核人 订阅人
任务:命令-方法—参数 时间 状态 类型
-- ---------------------------- -- Table structure for `fc_crontab_tasks` 定时任务 -- ---------------------------- DROP TABLE IF EXISTS `fc_crontab_tasks`; CREATE TABLE `fc_crontab_tasks` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `user_name` varchar(50)
NOT NULL DEFAULT '' COMMENT '任务提交者', `audit_name` varchar(50) DEFAULT NULL COMMENT '审核人', `ipaddress` varchar(15) NOT NULL DEFAULT '' COMMENT 'IP地址', `code_branch` varchar(255) NOT NULL DEFAULT '' COMMENT '代码分支', `command` varchar(255) NOT NULL DEFAULT ''
COMMENT '执行命令(控制器)', `action` varchar(255) DEFAULT '' COMMENT '执行命令(方法)', `parameters` varchar(255) DEFAULT '' COMMENT '执行命令参数', `comment` varchar(255) DEFAULT NULL COMMENT '备注', `crontab_time` varchar(20) DEFAULT NULL COMMENT '定时任务执行时间规则', `create_date` timestamp
NULL DEFAULT NULL COMMENT '任务创建时间', `update_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `audit_status` enum('untreated','pass','forbid') NOT NULL DEFAULT 'untreated' COMMENT '审核状态(通过/不准)', `audit_date` timestamp
NULL DEFAULT NULL COMMENT '审核时间', PRIMARY KEY (`id`), KEY `audit_state` (`audit_status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ---------------------------- -- Table structure for `fc_task_detail` -- ---------------------------- DROP TABLE IF EXISTS `fc_task_detail`; CREATE TABLE `fc_task_detail` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `pid` int(11) DEFAULT NULL COMMENT
'父进程id', `task_id` int(11) NOT NULL DEFAULT '0' COMMENT '任务id', `command` varchar(255) DEFAULT NULL COMMENT '命令-控制器', `action` varchar(255) DEFAULT NULL COMMENT '方法名', `parameters` varchar(255) DEFAULT NULL COMMENT '参数', `task_status` enum('untreated','running','over')
NOT NULL DEFAULT 'running' COMMENT '任务状态执行中/结束/错误/', `start_date` timestamp NULL DEFAULT NULL COMMENT '任务开始时间', `end_date` timestamp NULL DEFAULT NULL COMMENT '任务结束时间', `error_log` text COMMENT '错误日志', `out_log` text COMMENT '正常日志', PRIMARY KEY (`id`), KEY
`task_id` (`task_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
-- ---------------------------- -- Table structure for `fc_task_subscribe` 订阅任务 -- ---------------------------- DROP TABLE IF EXISTS `fc_task_subscribe`; CREATE TABLE `fc_task_subscribe` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `crontab_task_id`
int(11) NOT NULL COMMENT '模板id', `user_name` varchar(50) NOT NULL COMMENT '订阅用户', `user_email` varchar(50) NOT NULL COMMENT '用户邮箱', `subscribe_type` varchar(255) NOT NULL DEFAULT '' COMMENT '订阅类型', PRIMARY KEY (`id`), KEY `task_id` (`crontab_task_id`) ) ENGINE=InnoDB
DEFAULT CHARSET=utf8;
-- ---------------------------- -- Table structure for `fc_tasks` 临时任务 -- ---------------------------- DROP TABLE IF EXISTS `fc_tasks`; CREATE TABLE `fc_tasks` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `crontab_task_id` int(11) NOT NULL COMMENT
'模板id', `user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '创建任务人', `audit_name` varchar(50) DEFAULT NULL COMMENT '审核者', `task_type` enum('crontab','temporary') NOT NULL DEFAULT 'temporary' COMMENT '任务类型定时/临时', `ipaddress` varchar(15) NOT NULL COMMENT '执行任务主机IP地址', `code_branch`
varchar(255) NOT NULL COMMENT '代码分支', `crontab_time` varchar(20) DEFAULT NULL COMMENT '定时任务执行时间规则', `command` varchar(255) NOT NULL COMMENT '执行的命令(控制器)', `action` varchar(255) NOT NULL COMMENT '执行命令(方法)', `parameters` varchar(255) DEFAULT NULL COMMENT '命令参数', `comment`
varchar(255) DEFAULT NULL COMMENT '备注', `audit_date` timestamp NULL DEFAULT NULL COMMENT '审核时间', `task_status` enum('untreated','init','running','over') NOT NULL DEFAULT 'untreated' COMMENT '任务状态未处理/执行中/结束', `audit_status` enum('untreated','pass','forbid')
NOT NULL DEFAULT 'forbid' COMMENT '审核状态通过/禁止', `create_date` timestamp NULL DEFAULT NULL COMMENT '任务创建时间', `update_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '任务修改时间', `start_date` timestamp NULL DEFAULT NULL COMMENT
'任务开始时间', `end_date` timestamp NULL DEFAULT NULL COMMENT '任务结束时间', `report` text COMMENT '任务报告', `out_subscribe` text COMMENT '正常输出发送者', `error_subscribe` text COMMENT '异常发送者', `report_subscribe` text COMMENT '报告发送者', PRIMARY KEY (`id`), KEY `task_state` (`task_status`), KEY
`user_name` (`user_name`), KEY `audit_name` (`audit_name`), KEY `template_id` (`crontab_task_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
背景:更精准的反映公司盈利能力,实现精细化管理的需要,通过先进先出匹配数据实现
解释:
先进先出法的意思就是在计算生产成本的时候,原材料按照先进先出的原则入成本。比如说你库存的材料本来有100个,30个是一月的时候10块钱一个进的,40个是二月的时候15块钱一个进的,还有30个是你四月份20块钱一个进的货。这样子你的原材料总价值就是300 600 600=1500,均价15。
四月卖了50个单位的货物,价格是30快一个,消耗了50个单位的材料按照平均价格法你的当期毛利是50×30-50×15=750,但是按照先进先出法,你的成本就是30×10 20×15=600,毛利是900,显然,按照这个方法,物价上涨时期,销售额是高的,而用以计算的成本还是低价时期的,所以会导致利润高估。再看存货,按照平均价格法,你的材料剩余价值是15×50=750,而按照先进先出法,你的成本是1500-600=900,存货价值高估。
1.初始化:fifo_init_v2.sh
实时库存:正样残品 —>finance_inventory_stock_fifo
加权成本:期初 sku_month_cost=> sku_cost_day
存货汇总:finance_inventories_articulation 减去在途库存和金额
出入库:抓取前6个月的数据到新表中 warehouse_receipt_container warehouse_shipping_container
2.抓数据:ISFinanceFifoReceiptShippingCommand
单据:入库(加工入库 RMA\REJO\STI\SAI\TRK\JRK\RBR) 出库(加工出库 SO\SAO\PR\JCK\SAMPLE\SOD\STO\RBG\RBD\RBS) 采购(费用) 采退 调价 调拨出 调拨入 库存状态转换 盘盈盘亏
货主:TJ 自有商品非海淘化妆品 | BJ 非化妆品非海淘 | SHJM
出入库流水
finance_fifo_receipt_shipping_container 入库成本
3.匹配数据:ISFifoCommand
入库:
ASN\STRK\SAI\TRK\PY\JRK 直接将入库记录同时插入批次库存表和入库明细表即可
RMA\REJO\STI\ RBR 先去匹配其出库时的批次和货主,用出库时的批次和货主替换原记录,再插入批次库存表和入库明细表。异常就用入库的批次和货主,成本取期初,如果没有就取近似成本
出库:去匹配批次库存表中最早的一条数量不为0的入库记录,批次和货主分配给出库记录并插入出库明细,同时抵减批次库存表中对应数量;匹配不上的,进行虚拟盘盈(XNPY)的处理。将虚拟盘盈的批次和默认货主分配给异常数据,先在入库明细表中插入一条入库记录,再在出库明细表中插入一条出库记录。
处理出入库流水:
插入批次库存表 插入入库明细表 插入出库明细表(还要计算各种金额)
其他:近似成本 加工 出库匹配 入库批次和第二次入库特殊处理
调拨差异(在途库存)
a.出入库明细
finance_receipt_container 入库成本
finance_shipping_container 运费 结算价 加权成本
b.批次库存
finance_inventory_stock_fifo 存入库记录,用来出库时匹配批次和货主
finance_inventory_stock_fifo_ext RMA\REJO\STI\RBR入库对应的出库时的记录,
c.批次缓存
finance_inventory_stock_fifo_cache 相比上表多了一个时间,用来恢复数据
finance_inventory_stock_fifo_ext_cache 相比上表多了一个时间,用来恢复数据
4.计算数据
出入库流水的正品存货(合格 冻结)
上一期期初作为本期期末
出入库明细,入库(不算PA)为增加,出库(不算STD)为减少
计算加权成本*数量=正品存货汇总
--加权成本=期初金额 所有的入库金额/期初数量 所有的入库数量 (采购入库要匹配批次,加工包括合并和拆分)
—异常:分母是0 或 值为负数 就取该货主和SKU成本,如果还没有就取近似成本
—最后,加权成本写回出库明细表,入库明细表中更新调拨入库和虚拟盘盈的当期成本
期末正品在途库存数量 = 期初正品在途库存数量 – 本期正品调拨入库数量 本期正品调拨出库数量 – 本期正品调拨入残数量 – 本期正品调拨差异数量
5.镜像差异:
仓库镜像中正品数据(为基准) vs 财务批次库存正品数据
> 盘盈:插入入库明细和批次库存(先进先出),期末存货汇总增加
< 盘亏:插入出库明细,期末存货汇总减少
6.其他:
--金额
采退是先进先出,没按进价算
客退和拒收没匹配出库平均成本,而是采用期初平均成本
--归属
特殊 库存调整和加工货主是按照默认货主
领用与领用还回有状态不一致
--范围
没计入调价单
风控平台
背景:公司日常管理需要和每个季度的财审需求,通过对差异数据分析生成差异报告实现
一、结构功能图:
统计信息:
总览:差异条数 金额 以及 百分比 报警历史
分类:差异数据明细,统计时间 新增、修复和总计的金额/条数
趋势图:差异金额和条数的展示 趋势报表
分析信息:各业务线在指定时间段内的差异数据及其原因分析
订阅信息:
—业务类型和阀值(策略:每天 每周 总计 百分比 ==>金额与条数)超出了 ==>excel差异报告email给订阅人
—业务类型和订阅者
操作信息
业务信息
二、业务流程图(分析逻辑):抓取—>分析—>呈现—>分析—>呈现—>分析—>
抓取数据—> scan (业务逻辑 )
已分析过的差异数据统计—>统计信息发送—>web页面
未分析出原因的差异数据进行再次分析—>
差异数据
—>正常数据
—>差异数据
—>已明确差异原因数据
—>修复成正常数据并呈现
—>未明确差异原因数据
<--进行下一轮差异分析
三、数据字典
1.差异数据抓取表
wms vs jerp
采购核对 到货单 退货单
采购结算 到货单 vs 付款单 退货单 vs 收款单 结算单 vs 收款单/付款单
前端 vs wms
销售核对 销售出库 拒收入库 客退入库
销售结算 订单总优惠 订单总金额 商品优惠金额 用户流水
物流核对 前端订单 vs 物流
库存核对 wms vs jerp
关键时间段
FBJ
2.抓取分析器流程
扫描类
scanAbstract
mutliRun(多进程跑数)
—actionCheck(抽象类)
asnScan (./yiic asnScan multiRun)
actionCheck (具体实现类)
================================================================================
适配器类 (组合—>适配—>封装)
scanAnalyzeEngine
add(asnAnalyze) (扫描类通过分析器加载分析类)
rundata(asnAnalyze Check) (通过分析类对象实现数据分析过滤并写入)
================================================================================
分析类
analyzeAbstract
Curd(具体实现类)
—check (抽象类)
asnAnalyze
check(具体实现类)
================================================================================
复核类
revAbstract
-pending 是否有时间差异数据
review(issue pending) 实现
asnRev
uniqueKey
isPending
command 实例化所有的子review类,并调用父类的review方法,父类再调用analyze类去重新分析一轮
================================================================================
3.差异数据呈现表
主体:订阅表 业务负责人
业务:阀值表 业务数据 统计表 业务说明 操作历史
create database if not exists rice_state character set utf8 collate utf8_general_ci;
use rice_state;
CREATE TABLE `user_list` ( 订阅表
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件用户名',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '担任职务',
`description` varchar(255) NOT NULL DEFAULT '' COMMENT '说明该用户负责什么业务等一些附加信息',
`sms_number` varchar(32) NOT NULL DEFAULT '' COMMENT '接收短信的手机号',
`email_address` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件地址',
`sms_state` char(1) NOT NULL DEFAULT 'Y' COMMENT '是否允许接收sms',
`mail_state` char(1) NOT NULL DEFAULT 'Y' COMMENT '是否允许接收mail',
`create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`update_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8
CREATE TABLE `statistics_info` ( 统计表
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`biz_item` varchar(24) NOT NULL DEFAULT '' COMMENT '业务名',
`biz_category` varchar(255) not null default '' comment '业务分类',
`statistics_way` varchar(24) NOT NULL DEFAULT '' COMMENT '统计类型daily/hourly/weekly/monthly',
`statistics_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '统计时间点',
`fixed_count` int(11) NOT NULL DEFAULT '0' COMMENT '当期修复的差异数据数',
`added_count` int(11) NOT NULL DEFAULT '0' COMMENT '当期增加的差异数据数',
`total_count` int(11) NOT NULL DEFAULT '0' COMMENT '总的差异数据数',
`fixed_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当期修复的差异数据影响金额',
`added_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当期增加的差异数据影响金额',
`total_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '差异数据影响总金额',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_biz_item_way_time` (`biz_item`,`statistics_way`,`statistics_time`)
) ENGINE=InnoDB AUTO_INCREMENT=3000 DEFAULT CHARSET=utf8
CREATE TABLE `alarm_acl_policy` ( 阀值表
`alarm_id` int(11) NOT NULL AUTO_INCREMENT,
`biz_category` varchar(255) NOT NULL DEFAULT '' COMMENT '业务分类',
`rule` varchar(12) NOT NULL DEFAULT '' COMMENT '报警规则 如: rldw',
`r_ratio` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '比率:该次差异总金额与上次差异总金额的比率 0.00',
`l_limit` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '限制金额:当期增加的差异金额超过限额即报警 0.00',
`d_day` char(1) NOT NULL DEFAULT '' COMMENT '当天只要有新增加的差异数据就报警,根据daily的统计 Y/N',
`w_week` char(1) NOT NULL DEFAULT '' COMMENT '当周只要有新增加的差异数据就报警,根据weekly的统计 Y/N',
`from` varchar(255) DEFAULT NULL COMMENT 'alarm发送者地址',
`subject` varchar(8000) DEFAULT NULL COMMENT 'alarm标题',
`body` varchar(8000) DEFAULT NULL COMMENT 'alarm内容',
`create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`update_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`alarm_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
CREATE TABLE `alarm_user_map` ( 业务负责人
`id` int(11) NOT NULL AUTO_INCREMENT,
`alarm_id` varchar(255) NOT NULL DEFAULT '',
`user_id` varchar(255) NOT NULL DEFAULT '',
`user_name` varchar(255) NOT NULL comment '负责人姓名',
`state` varchar(255) NOT NULL DEFAULT 'Y',
`attach_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
create table `business_data_container` ( 业务数据
`id` int(11) not null auto_increment,
`biz_item` varchar(24) not null default '' comment '业务名',
`status` varchar(24) not null default '' comment '分析状态 new normal pending issue fixed',
`content` varchar(8000) not null default '' comment '差异数据详情(对应于business_list.columns)',
`amount` decimal(10,2) not null default '0.00' comment '影响金额',
`create_time` datetime not null default '0000-00-00 00:00:00',
`update_time` datetime not null default '0000-00-00 00:00:00',
primary key (`id`),
key `idx_create_time` (`create_time`)
) engine=InnoDB default charset=utf8 auto_increment=1;
CREATE TABLE `business_list` ( 业务说明
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`biz_item` varchar(24) NOT NULL DEFAULT '' COMMENT '业务名,全局唯一',
`biz_label` varchar(255) NOT NULL DEFAULT '' COMMENT '业务标签',
`biz_category` varchar(24) NOT NULL DEFAULT '' COMMENT '业务分类',
`description` varchar(8000) NOT NULL DEFAULT '' COMMENT '简单描述该业务的validate逻辑',
`columns` varchar(1024) NOT NULL DEFAULT '' COMMENT '该业务差异数据需要展现的列名(给审计报告的那种格式,根据业务需求来)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_biz_item` (`biz_item`),
KEY `idx_biz_category` (`biz_category`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8
create table alarm_history ( 操作历史
`id` int(11) unsigned not null auto_increment,
`alarm_id` varchar(255) not null default '' comment '某类业务某种发送方式的alarm',
`user_list` varchar(255) not null default '' comment '已经发送alarm的负责人List',
`content` varchar(255) not null default '' comment '发送内容',
`sent_time` datetime not null default '0000-00-00 00:00:00' comment '发送时间',
primary key (`id`)
) engine=InnoDB default charset=utf8 auto_increment=1;
跑数平台
背景:工作效率和数据安全需要,通过 yiic 脚本名 方法名 —参数1 —参数2 跑数实现
--数据抓取
父子进程共享代码空间,独享数据空间,
$pid = pcntl_fork(); //在当前进程当前位置产生分支(子进程)。
pcntl_fork();//创建子进程
if($pid<0){
//start //创建子进程失败
}else if($pid>0){
//parent id 父进程读取
}else{
//child implement //子进程读取
}
为了防止子进程成为僵尸进程,子进程执行后要返回给父进程一个信号量,父进程通过wait释放子进程所占用的资源,最后销毁父进程和没来的急处理的子进程记录
pcntl_signal(SIGCHLD, array($this, "childSignalHandler")); //信号量用来防止生成僵尸进程
包含下面:
$exitCode = pcntl_wexitstatus($status); //回收中断的子进程
$pid = pcntl_waitpid(-1, $status, WNOHANG); //回收已完成的子进程
unset($this->currentJobs[$pid]);//删除进程
unset($this->signalQueue[$pid]);;//删除子进程的信息记录
系统调用方法:
system() 赋值给变量就输出所有,第二个参数回最后一行。
exec() 赋值给变量后返回最后一行,第二个参数可通过数组获取所有返回结果。
shell_exec() 赋值给变量后输出所有结果
--数据校验
1)DWAbstractCommand: 数据模型抽象类
importData ClearDataAll ClearDataByDateSpan
2)DWPopAbstract:ETL抽象类继承DWAbstract
源表 目标表 差异表,相当于增量数据备份
对比源表和目标表的某个时间段内(递归找到某个时间段)的差异数据,包括数据字段(column)和数据(serialize),将差异数据汇总到到差异表中,然后与目标数据对比并修复
来源库和表 目标库和表
存在差异的数据量 当前插入的数据量
来源表数据和sum数据 目标表的数据和sum数 条数
3)表源数据抓取:具体实现类DWAbstractCommand.php继承DWPopAbstract:ETL
清除目标表数据
获取目标表数据 检测目标表sum
获取来源表数据 条数 检车来源表sum
4)差异数据记录PopDiffLog
修复标记 导入差异数据 字段和表数据验证 是否需要插入 删除和更新
--数据展示
接口:任务开始 任务执行状态(任务列表 详细) 任务结束
每分钟执行一次,进程不存在启动,初始化状态和报告信息,查找审核通过的任务执行(根据任务ID加载任务,传参并执行addRun),
轮询定时任务,检查已通过审核的任务,然后检查时效,如果已通过审核且已到期就加入任务列表准备执行
一、功能结构图:
新建任务:临时任务 定时任务
审核任务:通过 未通过
订阅任务:异常 输出 报告
统计任务:总计执行 异常 正常
操作日志:执行记录
二、业务流程图:
新建—>临时任务—>任务列表—>审核通过—>执行任务—>发送邮件
—>定时任务—>检查时间—>任务列表
三、数据字典:定时 临时 明细 订阅 统计 日志
主体:申请人 审核人 订阅人
任务:命令-方法—参数 时间 状态 类型
-- ---------------------------- -- Table structure for `fc_crontab_tasks` 定时任务 -- ---------------------------- DROP TABLE IF EXISTS `fc_crontab_tasks`; CREATE TABLE `fc_crontab_tasks` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `user_name` varchar(50)
NOT NULL DEFAULT '' COMMENT '任务提交者', `audit_name` varchar(50) DEFAULT NULL COMMENT '审核人', `ipaddress` varchar(15) NOT NULL DEFAULT '' COMMENT 'IP地址', `code_branch` varchar(255) NOT NULL DEFAULT '' COMMENT '代码分支', `command` varchar(255) NOT NULL DEFAULT ''
COMMENT '执行命令(控制器)', `action` varchar(255) DEFAULT '' COMMENT '执行命令(方法)', `parameters` varchar(255) DEFAULT '' COMMENT '执行命令参数', `comment` varchar(255) DEFAULT NULL COMMENT '备注', `crontab_time` varchar(20) DEFAULT NULL COMMENT '定时任务执行时间规则', `create_date` timestamp
NULL DEFAULT NULL COMMENT '任务创建时间', `update_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `audit_status` enum('untreated','pass','forbid') NOT NULL DEFAULT 'untreated' COMMENT '审核状态(通过/不准)', `audit_date` timestamp
NULL DEFAULT NULL COMMENT '审核时间', PRIMARY KEY (`id`), KEY `audit_state` (`audit_status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ---------------------------- -- Table structure for `fc_task_detail` -- ---------------------------- DROP TABLE IF EXISTS `fc_task_detail`; CREATE TABLE `fc_task_detail` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `pid` int(11) DEFAULT NULL COMMENT
'父进程id', `task_id` int(11) NOT NULL DEFAULT '0' COMMENT '任务id', `command` varchar(255) DEFAULT NULL COMMENT '命令-控制器', `action` varchar(255) DEFAULT NULL COMMENT '方法名', `parameters` varchar(255) DEFAULT NULL COMMENT '参数', `task_status` enum('untreated','running','over')
NOT NULL DEFAULT 'running' COMMENT '任务状态执行中/结束/错误/', `start_date` timestamp NULL DEFAULT NULL COMMENT '任务开始时间', `end_date` timestamp NULL DEFAULT NULL COMMENT '任务结束时间', `error_log` text COMMENT '错误日志', `out_log` text COMMENT '正常日志', PRIMARY KEY (`id`), KEY
`task_id` (`task_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
-- ---------------------------- -- Table structure for `fc_task_subscribe` 订阅任务 -- ---------------------------- DROP TABLE IF EXISTS `fc_task_subscribe`; CREATE TABLE `fc_task_subscribe` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `crontab_task_id`
int(11) NOT NULL COMMENT '模板id', `user_name` varchar(50) NOT NULL COMMENT '订阅用户', `user_email` varchar(50) NOT NULL COMMENT '用户邮箱', `subscribe_type` varchar(255) NOT NULL DEFAULT '' COMMENT '订阅类型', PRIMARY KEY (`id`), KEY `task_id` (`crontab_task_id`) ) ENGINE=InnoDB
DEFAULT CHARSET=utf8;
-- ---------------------------- -- Table structure for `fc_tasks` 临时任务 -- ---------------------------- DROP TABLE IF EXISTS `fc_tasks`; CREATE TABLE `fc_tasks` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `crontab_task_id` int(11) NOT NULL COMMENT
'模板id', `user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '创建任务人', `audit_name` varchar(50) DEFAULT NULL COMMENT '审核者', `task_type` enum('crontab','temporary') NOT NULL DEFAULT 'temporary' COMMENT '任务类型定时/临时', `ipaddress` varchar(15) NOT NULL COMMENT '执行任务主机IP地址', `code_branch`
varchar(255) NOT NULL COMMENT '代码分支', `crontab_time` varchar(20) DEFAULT NULL COMMENT '定时任务执行时间规则', `command` varchar(255) NOT NULL COMMENT '执行的命令(控制器)', `action` varchar(255) NOT NULL COMMENT '执行命令(方法)', `parameters` varchar(255) DEFAULT NULL COMMENT '命令参数', `comment`
varchar(255) DEFAULT NULL COMMENT '备注', `audit_date` timestamp NULL DEFAULT NULL COMMENT '审核时间', `task_status` enum('untreated','init','running','over') NOT NULL DEFAULT 'untreated' COMMENT '任务状态未处理/执行中/结束', `audit_status` enum('untreated','pass','forbid')
NOT NULL DEFAULT 'forbid' COMMENT '审核状态通过/禁止', `create_date` timestamp NULL DEFAULT NULL COMMENT '任务创建时间', `update_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '任务修改时间', `start_date` timestamp NULL DEFAULT NULL COMMENT
'任务开始时间', `end_date` timestamp NULL DEFAULT NULL COMMENT '任务结束时间', `report` text COMMENT '任务报告', `out_subscribe` text COMMENT '正常输出发送者', `error_subscribe` text COMMENT '异常发送者', `report_subscribe` text COMMENT '报告发送者', PRIMARY KEY (`id`), KEY `task_state` (`task_status`), KEY
`user_name` (`user_name`), KEY `audit_name` (`audit_name`), KEY `template_id` (`crontab_task_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
相关文章推荐
- LNMP的403问题总结
- 欢迎使用CSDN-markdown编辑器
- c++基础--auto类型说明符/decltype类型指示符
- Present from Lena
- 【数据结构】直接插入排序
- C Primer Plus之结构和其他数据形式
- CString转string
- 开博了
- Python 代码实现 JPG图片转PGM图片
- 方向盘操控
- html5css3杂记
- Maven如何手动添加依赖的jar文件到本地Maven仓库
- 2015年年度总结
- 云计算的力量
- nginx rewrite 相关、重定向
- 用NSURLSession从网络获取图片
- 杭电2036-改革春风吹满地
- laravel5.1 数据库相关,操作底层实现
- laravel5.1 日志相关
- 通过HttpURLConnection获取网页图片 并保存至内存卡的例子