传送门
架构图
configserver
configserver主要为配置信息,在main类加注解EnableConfigServer
application.yml中指明server端口,spring.application.name (微服务名称)
配置注册中心consul的地址端口,注册服务名,perfer-ip-address
配置了配置中心地址,读取的用户名密码,完整的配置信息在gitee:https://gitee.com/gaohuamao/zgh-config.git中,在其中区分是什么环境和配置信息
zuul
文件访问,优先到zuul中, zuul中配置关键配置信息
zuul:
routes:
microservice-zgh-server-auth: /api/auth/**
microservice-zgh-server-api: /api/**
访问 路由转向微服务 microservice-zgh-server-api
zgh-server-api
负责任务分发如上面zuul中的调用转到zgh-server-api后,由对应collectController接收,调用到对应方法,走feign访问对应微服务接口
@PostMapping("/frequency/list")
public ResponseModel frequencyList(@RequestBody RequestModel<CollectFrequencyVO> requestModel){
PageInfo pageInfo = collectFeign.frequencyList(requestModel);
return new ResponseModel(pageInfo);
}
feign接口决定转发给哪个微服务 com.inossem.zgh.framework.util.constant.FeignConstant
@FeignClient(name = FeignConstant.MICROSERVICE_STOCKCALCULATE)
public interface CollectFeign {
@RequestMapping(value = "/calculate/collect/frequency/list" , method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
PageInfo frequencyList(RequestModel<CollectFrequencyVO> model);
@RequestMapping(value = "/calculate/collect/frequency/export" , method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
List<CollectFrequencyVO> export(RequestModel<CollectFrequencyVO> requestModel);
}
hystrix
配置项,
@SpringBootApplication
@EnableHystrixDashboard
@EnableTurbine
public class HystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}
management:
endpoints:
web:
exposure:
include: hystrix.stream,routes,filters,health
对应监控地址http://192.168.3.204:8041//actuator/hystrix.stream 等
管理健康流,路由信息,过滤信息等
log
切面类
com.inossem.zgh.framework.log.aspect.CallLogAspect
切点:controller 包下方法
com.inossem.zgh.framework.log.aspect.OperLogAspect
切点: com.inossem.zgh.framework.log.annotation.OperLog 注解
FeginInterceptor
基础资料
三大基础资料间均为多对多关系
备件
指的是电厂的备件(投入使用物料,资产)
备件父子码
记录备件的bom关系
备件分类
使备件为3级分类树状结构
替代品
指物料直接的替代关系记录
工厂
具体的物理工厂,非供应商或产地。为消耗备件和消耗品的主要场所,供电等的物理单元
功能位置
抽象的功能位置,比如工厂需要具体的继电器等,多个工厂可以公用同一个继电器。为多个备件构成,有设备级别属性,与工厂可以形成唯一维度记录展示具体功能位置信息
参数含义
领用率
指备件被领用通用频率等级,分AB类设置,对应参数表 opi_setting_collect_rate ,根据历史预防性工单可推测
故障率
指备件通用故障等级,分AB,C类设置,对应参数表 opi_setting_fault_ratio ,根据历史纠正类工单可推测
库存满足率
通用基本参数,不与其他基础资料绑定或者关联,代表库存满足率等级和安全性等级, 对应主参数表 data_stock_fill_rate ,查询方法/api/calculate/stockFillRate/getMatStockFillRateList
。
查询基础资料时,与 material_calculate_param 表做关联,物料相关信息存储在material_calculate_param表,data_stock_fill_rate为基础数据表,关联展示用。
库存冗余系数
通用基础资料参数,
库存水位标准
设置库存中具体物备件类型或者具体备件的库存上下限,
以物料设置水位时:记录存储表 :opi_setting_material_stock_waterlevel 以备件+工厂为维度设置水位,关联 mcr表
以物料类型设置水位标准时,记录存储在 opi_setting_categroy_stock_waterlevel 表, 表中记录父子类id,水位信息
采购提前期
查询主方法:`com.inossem.zgh.server.stockcalculate.service.PurAdvDayMatService#getPurAdvDayMatListAll`
消耗品消耗周期
业务流程
备件关系清洗
http://192.168.3.204:8041/api/clean/funclocation/eventlist
具体代码位置
com.inossem.zgh.server.dataclean.web.controller.FuncLocationController#eventList
查找表data_clean_funclocation_event left join dictionary_item left join user
库存优化分析
故障率查询
查询调用 :
http://192.168.3.204:8041/api/dictionary/getList
转发后调用位置
com.inossem.zgh.server.dataclean.web.controller.DictionaryController#getList
返回数据调用:
http://192.168.3.204:8041/api/calculate/faultRatio/list
转发后调用位置
com.inossem.zgh.server.stockcalculate.web.controller.FaultRatioController#list
查询表:
material_calculate_param inner join material inner join dictionary_item
故障率计算
调用 /api/calculate/faultRatio/calculate
核心计算位置
com.inossem.zgh.server.stockcalculate.web.controller.FaultRatioController#calculateProcess
计算逻辑:
1、获取ABList (AB(备件)类故障集合), 获取CList (C(消耗品)类故障集合) :过滤不同
- 根据 data_order_history 物料消耗数量统计物料消耗次数,sum后除以最早一次消耗距今月份后*12,代表年消耗次数 也就是说 故障率= 总的故障次数/(最早一次故障距今年数) 代表年均故障率。将abc放在一个集合中。
- 结合参数表material_calculate_param判断集合中物料是否存在来判断是insert||update,放到集合的dataType中记录。
2、先处理消耗品故障率低的,用故障率低的表左关联替代关系表,再关联故障率高的表,获取后放入集合listClow中
整体思想为保守思想,可能出现故障率高的情况记录故障率为高,如果有替代品且替代品故障率高,但是原品故障率低,记录。计算替代品故障率时要排除此替代情况。主要计算C类物料。 结合参数表material_calculate_param判断集合中物料是否存在来判断是insert||update
库存冗余查询
查询
1、顶部过滤项查询:
- /api/dictionary/getList,payLoad中t {typeCode: “MATERIAL_LEVEL”} 查询备件级别
- /api/dictionary/getList,payLoad中{typeCode: “COLLECT_RATIO”}查询领用频率后台处理逻辑
dictionaryService.getDictionaryList(DictionaryVO);
model中 sql区分where type_code = #{typeCode}
- /api/material/category/list,查询物料类别。 响应位置
com.inossem.zgh.server.dataclean.web.controller.MaterialCategoryController#getModel
,方法中,先获取根节点,再根据根节点获取下面的分类获取对应实际数据(material_category 树状结构表) - /api/calculate/stockRedundancy/list 主数据查询(根据上面的过滤信息)。响应位置
com.inossem.zgh.server.stockcalculate.web.controller.StockRedundancyController#list
,查询表:
from `material_calculate_param` mcp inner join `material` m on mcp.`material_id` = m.`id`
inner join `material_category_relation` mcr on m.id = mcr.material_id
inner join `material_category` mc1 on mcr.`parent_category_id` = mc1.`id`
inner join `material_category` mc2 on mcr.`category_id` = mc2.`id`
left join `dictionary_item` di on di.`key` = mcp.`collect_ratio` and di.`type_code` = "COLLECT_RATIO"
计算
计算逻辑位置:com.inossem.zgh.server.stockcalculate.service.StockRedundancyService#calculate
1、库存冗余系数与对应关系list 查询sql:
SELECT basic_info.id AS materialId,calculate_param.year_no AS redundancyYearNo,calculate_param.double_no AS redundancyDoubleNo from
(SELECT m.id,
CASE m.level WHEN "A" THEN 1 WHEN "B" THEN 1 WHEN "C" THEN 2 END AS material_level,
mcp.fault_ratio FROM `material` m
INNER JOIN `material_calculate_param` mcp ON m.id = mcp.`material_id` ) AS basic_info
INNER JOIN
(SELECT m1.type, m1.level, IFNULL(m1.year_no,m2.year_no) AS year_no, IFNULL(m1.double_no,m2.double_no) AS double_no FROM
`opi_setting_stock_redundancy_ratio` m1 INNER JOIN
(SELECT * FROM opi_setting_stock_redundancy_ratio WHERE `level` = 0) AS m2 ON m1.type = m2.type) AS calculate_param
ON basic_info.fault_ratio = calculate_param.level AND basic_info.material_level = calculate_param.type
结果集:物料id、冗余系数中的年份数量、冗余系数中的倍数值 取出后更新到参数表
2、根据1中结果集 calculateParamDTOList (物料id、冗余系数中的年份数量、冗余系数中的倍数值)计算实际库存和移动平均价(总金额/非限制库存数量+在途库存数量)得到 calculateParamDTOList1 (结果集:物料id,当前库存stockNow,平均价格averagePrice),更新到参数表中。计算位置:com.inossem.zgh.server.stockcalculate.service.StockRedundancyService#calculatePriceAndStock
3.计算n年的领用数量,合并到一个list中:
calculateParamDTOList2 (结果集:materialid 物料id,collectValue 领用数量,collect_ratio领用频率,redundancy_year_no 冗余系数中的年份数量,redundancy_double_no 冗余系数中的倍数,average_price 平均价,stockNow 当前库存,collectCountNyear n年领用数量)
4、针对结果集中的list,遍历计算,计算逻辑位置:com.inossem.zgh.server.stockcalculate.service.StockRedundancyService#calculateRedundancy
是否冗余=当前库存数-(n年领用数量*冗余系数倍数)和0相比
领用预测查询
api/calculate/reqForecast/searchReqHisMonth 业务调用:com.inossem.zgh.server.stockcalculate.web.controller.ReqForecastController#searchReqHisMonth
查询信息:
- /api/calculate/reqForecast/searchReqHisMonth
构造两年内的月份合集,然后在sql中unionall出所有月份记录,再统计领用次数和数量 - /api/calculate/reqForecast/searchReqHisOverview
历史领用简单查询 - /api/calculate/reqForecast/searchFunclocation
功能位置简单查询 - /api/calculate/reqForecast/searchReqHisDetail
- 历史领用清单
库龄分析看板
?
消耗品储备建议
查询
controller位置com.inossem.zgh.server.stockcalculate.web.controller.StoreAdviceController#cMaterialList
select
m.id as id, m.material_code as materialCode, m.material_level as materialLevel, m.factory_id as factoryId,
d2.value as calculateStatusDes, m.material_des as materialDes, concat(c1.name,'-',c2.name) as categoryDes,
d1.value as faultRatioDes, m.advance_day as advanceDay, m.count_store as countStore, m.count_onway as countOnway,
m.reorder_point as reorderPoint, m.stock_safty as stockSafty, m.store_max as storeMax, m.consume_day as consumeDay, m.fill_rate as fillRate,
m.store_water_max as storeWaterMax, m.store_water_min as storeWaterMin,
m.consume_last_year_average_month as consumeLastYearAverageMonth,
m.consume_last_3month as consumeLast3month, m.consume_future_3month as consumeFuture3month,
m.modified_time as modifiedTime
from material_calculate_data_cmat_store_advice m
left join (SELECT * FROM dictionary_item WHERE type_code = 'FAULT_RATIO') d1 ON m.fault_ratio = d1.key
left join (SELECT * FROM dictionary_item WHERE type_code = 'CALCULATE_STATUS') d2 ON m.calculate_status = d2.key
inner join material_category c1 on m.category_parent_id = c1.id
inner join material_category c2 on m.category_id = c2.id
where 1=1 and m.material_level = 'C'
order by m.modified_time,m.id desc
计算
响应位置:com.inossem.zgh.server.stockcalculate.web.controller.StoreAdviceController#cMaterial
逻辑位置:com.inossem.zgh.server.stockcalculate.service.StoreAdviceService#cMaterial
计算步骤:
- 删除C类数据:删除material_calculate_data_cmat_store_advice表中物料类别为C类的数据
- 清空采购冗余数据:update备件工厂关系表material_factory_relation中列为空
- 清空分类和工厂关系表:delete from material_factory_category_monthconsume (备件的工厂+分类维度的领用数据)
- 采购提前期数据计算
-冗余采购提前期(按照分类大类设置) updateAdvDayByCategoryParent
-冗余采购提前期(按照分类小类设置) updateAdvDayByCategoryChild
-冗余采购提前期(按照备件设置) updateAdvDayByMat
-冗余库存水位(按照分类大类设置) updateWaterLevelByCategoryParent
-冗余库存水位(按照分类小类设置) updateWaterLevelByCategoryChild
-冗余库存水位(按照备件设置)updateWaterLevelByMat
-冗余消耗周期 updateConsumeDay - 获取未配置工厂的物料 noFactoryCMatList 501错误状态
- 获取配置了工厂,但未设置采购提前期的物料,再取出其他的信息 getNoAdvanceList 502
- 获取没有领用预测的物料 getNoCollectForecast 503
- 获取没有库存满足率的物料 getNoStockFillRate 504
- 获取没有设置消耗周期的物料 getNoConsumeDay 505
- 计算同小类下的消耗MAD (月均消耗)
- 计算需要进行同分类计算的分类和工厂关系(消耗品、故障率为低、设置了采购提前期、消耗周期和满足率) getFacCatList
- 计算供给偏差W因素 updateSupplyDeviation
- 计算分类和工厂关系的近12个月的月平均领用(不包含替代品覆盖) 分类和工厂关系的近12个月的每个月领用
- 计算消耗MAD
- 计算安全库存 updateSaftyStock
- 计算再订货点 updateReorderPoint
- 处理数据集合 getTrueCalculateList
- 插入集合数据 insert
- 更新库存和在途 updateStoreCount
- 计算近一年平均 updateOneYearConsume
- 计算近三个月总消耗 update3MonthConsume