您的位置:首页 > 其它

软件项目

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: