SupplyParticularsService.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. package com.jeeplus.modules.supply.particulars.service;
  2. import com.google.common.collect.Lists;
  3. import com.jeeplus.common.utils.StringUtils;
  4. import com.jeeplus.core.persistence.Page;
  5. import com.jeeplus.core.service.CrudService;
  6. import com.jeeplus.modules.supply.judgementBills.entity.SupplyJudgementBills;
  7. import com.jeeplus.modules.supply.particulars.entity.SupplyParticulars;
  8. import com.jeeplus.modules.supply.particulars.mapper.SupplyParticularsMapper;
  9. import com.jeeplus.modules.supply.stockOut.entity.SupplyStockOut;
  10. import org.springframework.stereotype.Service;
  11. import org.springframework.transaction.annotation.Transactional;
  12. import java.math.BigDecimal;
  13. import java.util.*;
  14. /**
  15. * 超欠供明细service
  16. * @author: 徐滕
  17. * @create: 2022-03-02 10:43
  18. **/
  19. @Service
  20. @Transactional(readOnly = true)
  21. public class SupplyParticularsService extends CrudService<SupplyParticularsMapper, SupplyParticulars> {
  22. @Override
  23. public Page<SupplyParticulars> findPage(Page<SupplyParticulars> page, SupplyParticulars supplyParticulars) {
  24. //如果送审id和项目定义号均为空 则表示没有选择筛选项,则不进行数据查询展示
  25. if(StringUtils.isBlank(supplyParticulars.getProjectDefinition()) && StringUtils.isBlank(supplyParticulars.getSubmittalsId())){
  26. return super.findOverPage(page, supplyParticulars);
  27. }
  28. return getProjectDefinitionPage(page, supplyParticulars);
  29. }
  30. /**
  31. * 查询项目定义号对应的数据信息
  32. * @param page
  33. * @param supplyParticulars
  34. * @return
  35. */
  36. public Page<SupplyParticulars> getProjectDefinitionPage(Page<SupplyParticulars> page, SupplyParticulars supplyParticulars) {
  37. //根据项目定义号查询出库表某个或某几个项目定义号的所有出库数据
  38. //项目定义号以;隔开
  39. String[] split = supplyParticulars.getProjectDefinition().split(";");
  40. List projectDefinitionList = Arrays.asList(split);
  41. //根据项目定义号查询出库表信息
  42. List<SupplyStockOut> supplyStockOutList = mapper.getSupplyStockOutList(projectDefinitionList);
  43. //对出库单数据进行分组
  44. Map<String, List<SupplyStockOut>> supplyStockOutListMap = this.groupSupplyStockOut(supplyStockOutList);
  45. //查询审定单中的数据信息
  46. List<SupplyJudgementBills> supplyJudgementBillsList = mapper.getSupplyJudgementBillsListList(projectDefinitionList);
  47. //对审定单数据进行分组
  48. Map<String, List<SupplyJudgementBills>> supplyJudgementBillsListMap = this.groupSupplyJudgementBills(supplyJudgementBillsList);
  49. List<SupplyParticulars> supplyParticularsList = disposeDataMap(supplyStockOutListMap, supplyJudgementBillsListMap);
  50. //对超欠供明细数据进行分组
  51. Map<String, List<SupplyParticulars>> supplyParticularsListMap = this.groupByMaterialsType(supplyParticularsList);
  52. List<SupplyParticulars> particularsList = disposeDataMapByMaterialsType(supplyParticularsListMap);
  53. SupplyParticulars supplyParticularsCollect = disposeDataCollect(supplyParticularsList);
  54. particularsList.add(supplyParticularsCollect);
  55. int size = 0;
  56. for (SupplyParticulars info : particularsList) {
  57. size ++;
  58. info.setId(String.valueOf(size));
  59. }
  60. page.setList(particularsList);
  61. return page;
  62. }
  63. /**
  64. * 出库单数据分组
  65. * @param supplyStockOutList
  66. * @return
  67. */
  68. public Map<String,List<SupplyStockOut>> groupSupplyStockOut (List<SupplyStockOut> supplyStockOutList){
  69. Map<String, List<SupplyStockOut>> map = new HashMap<>();
  70. for(SupplyStockOut stockOut : supplyStockOutList){
  71. if(map.containsKey(stockOut.getProjectDefinition())){//map中存在此id,将数据存放当前key的map中
  72. map.get(stockOut.getProjectDefinition()).add(stockOut);
  73. }else{//map中不存在,新建key,用来存放数据
  74. List<SupplyStockOut> tmpList = new ArrayList<>();
  75. tmpList.add(stockOut);
  76. map.put(stockOut.getProjectDefinition(), tmpList);
  77. }
  78. }
  79. return map;
  80. }
  81. /**
  82. * 审定单数据分组
  83. * @param supplyJudgementBillsList
  84. * @return
  85. */
  86. public Map<String,List<SupplyJudgementBills>> groupSupplyJudgementBills (List<SupplyJudgementBills> supplyJudgementBillsList){
  87. Map<String, List<SupplyJudgementBills>> map = new HashMap<>();
  88. for(SupplyJudgementBills judgementBills : supplyJudgementBillsList){
  89. if(map.containsKey(judgementBills.getProjectDefinition())){//map中存在此id,将数据存放当前key的map中
  90. map.get(judgementBills.getProjectDefinition()).add(judgementBills);
  91. }else{//map中不存在,新建key,用来存放数据
  92. List<SupplyJudgementBills> tmpList = new ArrayList<>();
  93. tmpList.add(judgementBills);
  94. map.put(judgementBills.getProjectDefinition(), tmpList);
  95. }
  96. }
  97. return map;
  98. }
  99. /**
  100. * 超欠供明细表根据材料类型进行分组
  101. * @param supplyParticulars
  102. * @return
  103. */
  104. public Map<String,List<SupplyParticulars>> groupByMaterialsType (List<SupplyParticulars> supplyParticulars){
  105. Map<String, List<SupplyParticulars>> map = new HashMap<>();
  106. for(SupplyParticulars particulars : supplyParticulars){
  107. if(map.containsKey(particulars.getMaterialsType())){//map中存在此id,将数据存放当前key的map中
  108. map.get(particulars.getMaterialsType()).add(particulars);
  109. }else{//map中不存在,新建key,用来存放数据
  110. List<SupplyParticulars> tmpList = new ArrayList<>();
  111. tmpList.add(particulars);
  112. map.put(particulars.getMaterialsType(), tmpList);
  113. }
  114. }
  115. return map;
  116. }
  117. private List<SupplyParticulars> disposeDataMapByMaterialsType(Map<String, List<SupplyParticulars>> supplyParticularsMap){
  118. List<SupplyParticulars> supplyParticularsList = Lists.newArrayList();
  119. Set<String> supplyParticularsMapKeySet = supplyParticularsMap.keySet();
  120. List<String> supplyParticularsMapKeyList = new ArrayList<>(supplyParticularsMapKeySet);
  121. //获取迭代器
  122. Iterator<String> supplyParticularsMapKey = supplyParticularsMapKeyList.iterator();
  123. while (supplyParticularsMapKey.hasNext()){
  124. String particularsMapKey = supplyParticularsMapKey.next();
  125. //获取迭代器
  126. switch (particularsMapKey){
  127. case "设备":
  128. List<SupplyParticulars> facilityList = supplyParticularsMap.get("设备");
  129. supplyParticularsList.addAll(facilityList);
  130. SupplyParticulars facility = disposeDataByMaterialsType(facilityList, "设备");
  131. supplyParticularsList.add(facility);
  132. break;
  133. case "材料":
  134. List<SupplyParticulars> materialsList = supplyParticularsMap.get("材料");
  135. supplyParticularsList.addAll(materialsList);
  136. SupplyParticulars materials = disposeDataByMaterialsType(materialsList, "材料");
  137. supplyParticularsList.add(materials);
  138. break;
  139. case "-":
  140. List<SupplyParticulars> otherList = supplyParticularsMap.get("-");
  141. supplyParticularsList.addAll(otherList);
  142. SupplyParticulars other = disposeDataByMaterialsType(otherList, "-");
  143. supplyParticularsList.add(other);
  144. break;
  145. }
  146. }
  147. return supplyParticularsList;
  148. }
  149. /**
  150. * 数据处理
  151. * @param supplyParticularsList 数据信息
  152. * @param materialsType 材料类型
  153. * @return
  154. */
  155. private SupplyParticulars disposeDataByMaterialsType(List<SupplyParticulars> supplyParticularsList,String materialsType){
  156. BigDecimal supplyMoneyB = new BigDecimal(0);
  157. BigDecimal planMoneyB = new BigDecimal(0);
  158. BigDecimal practicalMoneyB = new BigDecimal(0);
  159. for (SupplyParticulars facility : supplyParticularsList) {
  160. BigDecimal supplyMoney = new BigDecimal(facility.getSupplyMoney());
  161. BigDecimal planMoney = new BigDecimal(facility.getPlanMoney());
  162. BigDecimal practicalMoney = new BigDecimal(facility.getPracticalMoney());
  163. supplyMoneyB = supplyMoneyB.add(supplyMoney);
  164. planMoneyB = planMoneyB.add(planMoney);
  165. practicalMoneyB = practicalMoneyB.add(practicalMoney);
  166. }
  167. SupplyParticulars supplyParticulars = new SupplyParticulars();
  168. supplyParticulars.setBatch("");
  169. switch (materialsType){
  170. case "设备":
  171. supplyParticulars.setMaterialDescription("设备购置费合计");
  172. break;
  173. case "材料":
  174. supplyParticulars.setMaterialDescription("装置性材料费合计");
  175. break;
  176. case "-":
  177. supplyParticulars.setMaterialDescription("其他购置费合计");
  178. break;
  179. }
  180. supplyParticulars.setUnit("");
  181. supplyParticulars.setActualQuantityIssued("");
  182. supplyParticulars.setExamineCount("");
  183. supplyParticulars.setSupplyCount("");
  184. supplyParticulars.setUnitPrice("");
  185. String supplyMoneyBStr = supplyMoneyB.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
  186. String[] supplyMoneyBStrSS = supplyMoneyBStr.split("\\.");
  187. String supplyMoneyBIntegerStr = supplyMoneyBStrSS[0].replaceAll("(?<=\\d)(?=(?:\\d{3})+$)", ",");
  188. supplyParticulars.setSupplyMoney(supplyMoneyBIntegerStr + "." + supplyMoneyBStrSS[1]);
  189. supplyParticulars.setCommodityHandleTenet("");
  190. String planMoneyBStr = planMoneyB.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
  191. String[] planMoneyBStrSS = planMoneyBStr.split("\\.");
  192. String planMoneyBIntegerStr = planMoneyBStrSS[0].replaceAll("(?<=\\d)(?=(?:\\d{3})+$)", ",");
  193. supplyParticulars.setPlanMoney(planMoneyBIntegerStr + "." + planMoneyBStrSS[1]);
  194. String practicalMoneyBStr = practicalMoneyB.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
  195. String[] practicalMoneyBStrSS = practicalMoneyBStr.split("\\.");
  196. String practicalMoneyBIntegerStr = practicalMoneyBStrSS[0].replaceAll("(?<=\\d)(?=(?:\\d{3})+$)", ",");
  197. supplyParticulars.setPracticalMoney(practicalMoneyBIntegerStr + "." + practicalMoneyBStrSS[1]);
  198. supplyParticulars.setSupplyReason("");
  199. supplyParticulars.setRemarks("");
  200. return supplyParticulars;
  201. }
  202. /**
  203. * 数据汇总处理
  204. * @param supplyParticularsList 数据信息
  205. * @return
  206. */
  207. private SupplyParticulars disposeDataCollect(List<SupplyParticulars> supplyParticularsList){
  208. BigDecimal supplyMoneyB = new BigDecimal(0);
  209. BigDecimal planMoneyB = new BigDecimal(0);
  210. BigDecimal practicalMoneyB = new BigDecimal(0);
  211. for (SupplyParticulars facility : supplyParticularsList) {
  212. BigDecimal supplyMoney = new BigDecimal(facility.getSupplyMoney());
  213. BigDecimal planMoney = new BigDecimal(facility.getPlanMoney());
  214. BigDecimal practicalMoney = new BigDecimal(facility.getPracticalMoney());
  215. supplyMoneyB = supplyMoneyB.add(supplyMoney);
  216. planMoneyB = planMoneyB.add(planMoney);
  217. practicalMoneyB = practicalMoneyB.add(practicalMoney);
  218. }
  219. SupplyParticulars supplyParticulars = new SupplyParticulars();
  220. supplyParticulars.setBatch("");
  221. supplyParticulars.setMaterialDescription("甲供物资合计");
  222. supplyParticulars.setUnit("");
  223. supplyParticulars.setActualQuantityIssued("");
  224. supplyParticulars.setExamineCount("");
  225. supplyParticulars.setSupplyCount("");
  226. supplyParticulars.setUnitPrice("");
  227. String supplyMoneyBStr = supplyMoneyB.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
  228. String[] supplyMoneyBStrSS = supplyMoneyBStr.split("\\.");
  229. String supplyMoneyBIntegerStr = supplyMoneyBStrSS[0].replaceAll("(?<=\\d)(?=(?:\\d{3})+$)", ",");
  230. supplyParticulars.setSupplyMoney(supplyMoneyBIntegerStr + "." + supplyMoneyBStrSS[1]);
  231. supplyParticulars.setCommodityHandleTenet("");
  232. String planMoneyBStr = planMoneyB.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
  233. String[] planMoneyBStrSS = planMoneyBStr.split("\\.");
  234. String planMoneyBIntegerStr = planMoneyBStrSS[0].replaceAll("(?<=\\d)(?=(?:\\d{3})+$)", ",");
  235. supplyParticulars.setPlanMoney(planMoneyBIntegerStr + "." + planMoneyBStrSS[1]);
  236. String practicalMoneyBStr = practicalMoneyB.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
  237. String[] practicalMoneyBStrSS = practicalMoneyBStr.split("\\.");
  238. String practicalMoneyBIntegerStr = practicalMoneyBStrSS[0].replaceAll("(?<=\\d)(?=(?:\\d{3})+$)", ",");
  239. supplyParticulars.setPracticalMoney(practicalMoneyBIntegerStr + "." + practicalMoneyBStrSS[1]);
  240. supplyParticulars.setSupplyReason("");
  241. supplyParticulars.setRemarks("");
  242. return supplyParticulars;
  243. }
  244. private List<SupplyParticulars> disposeDataMap(Map<String, List<SupplyStockOut>> supplyStockOutListMap,Map<String, List<SupplyJudgementBills>> supplyJudgementBillsListMap){
  245. List<SupplyParticulars> supplyParticularsList = Lists.newArrayList();
  246. Set<String> supplyStockOutListMapKeySet = supplyStockOutListMap.keySet();
  247. Set<String> supplyJudgementBillsListMapKeySet = supplyJudgementBillsListMap.keySet();
  248. List<String> supplyStockOutListMapKeyList = new ArrayList<>(supplyStockOutListMapKeySet);
  249. List<String> supplyJudgementBillsListMapKeyList = new ArrayList<>(supplyJudgementBillsListMapKeySet);
  250. //获取迭代器
  251. Iterator<String> supplyStockOutListMapKey = supplyStockOutListMapKeyList.iterator();
  252. while (supplyStockOutListMapKey.hasNext()){
  253. Boolean flag = false;
  254. String stockOutMapKey = supplyStockOutListMapKey.next();
  255. //获取迭代器
  256. Iterator<String> supplyJudgementBillsListMapKey = supplyJudgementBillsListMapKeyList.iterator();
  257. while (supplyJudgementBillsListMapKey.hasNext()){
  258. String judgementBillsMapKey = supplyJudgementBillsListMapKey.next();
  259. if (stockOutMapKey.equals(judgementBillsMapKey)){
  260. //如果两个key键相同,则表示出库单和审定单均有该项目定义号的数据信息
  261. //获取该key键对应的list数据
  262. List<SupplyStockOut> supplyStockOutList = supplyStockOutListMap.get(stockOutMapKey);
  263. List<SupplyJudgementBills> supplyJudgementBillsList = supplyJudgementBillsListMap.get(judgementBillsMapKey);
  264. //对相同项目定义号的数据进行处理
  265. List<SupplyParticulars> supplyParticularsByMaterialNumberList = disposeMaterialNumberDataList(supplyStockOutList, supplyJudgementBillsList);
  266. if(supplyParticularsByMaterialNumberList.size()>0){
  267. supplyParticularsList.addAll(supplyParticularsByMaterialNumberList);
  268. }
  269. flag = true;
  270. //删除map中对应key键信息
  271. supplyJudgementBillsListMapKey.remove();
  272. supplyJudgementBillsListMap.remove(judgementBillsMapKey);
  273. }
  274. }
  275. //判定当前出库单是否进行数据处理,如果没有对应审定单则另行处理
  276. if(!flag){
  277. List<SupplyStockOut> supplyStockOutList = supplyStockOutListMap.get(stockOutMapKey);
  278. List<SupplyJudgementBills> supplyJudgementBillsList = Lists.newArrayList();
  279. //对相同项目定义号的数据进行处理
  280. List<SupplyParticulars> supplyParticularsByMaterialNumberList = disposeMaterialNumberDataList(supplyStockOutList, supplyJudgementBillsList);
  281. if(supplyParticularsByMaterialNumberList.size()>0){
  282. supplyParticularsList.addAll(supplyParticularsByMaterialNumberList);
  283. }
  284. }
  285. supplyStockOutListMapKey.remove();
  286. supplyStockOutListMap.remove(stockOutMapKey);
  287. }
  288. //判定审定单map列表是否存在未处理的数据,如果存在则对剩余数据进行处理
  289. if(supplyJudgementBillsListMap.size() > 0){
  290. Iterator<String> supplyJudgementBillsListMapKey = supplyJudgementBillsListMapKeyList.iterator();
  291. while (supplyJudgementBillsListMapKey.hasNext()){
  292. String judgementBillsMapKey = supplyJudgementBillsListMapKey.next();
  293. List<SupplyStockOut> supplyStockOutList = Lists.newArrayList();
  294. List<SupplyJudgementBills> supplyJudgementBillsList = supplyJudgementBillsListMap.get(judgementBillsMapKey);
  295. //对相同项目定义号的数据进行处理
  296. List<SupplyParticulars> supplyParticularsByMaterialNumberList = disposeMaterialNumberDataList(supplyStockOutList, supplyJudgementBillsList);
  297. if(supplyParticularsByMaterialNumberList.size()>0){
  298. supplyParticularsList.addAll(supplyParticularsByMaterialNumberList);
  299. }
  300. //删除map中对应key键信息
  301. supplyJudgementBillsListMapKey.remove();
  302. supplyJudgementBillsListMap.remove(judgementBillsMapKey);
  303. }
  304. }
  305. return supplyParticularsList;
  306. }
  307. /**
  308. * 物料编码对应数据处理
  309. * @param supplyStockOutList
  310. * @param supplyJudgementBillsList
  311. * @return
  312. */
  313. private List<SupplyParticulars> disposeMaterialNumberDataList(List<SupplyStockOut> supplyStockOutList , List<SupplyJudgementBills> supplyJudgementBillsList){
  314. List<SupplyParticulars> supplyParticularsList = Lists.newArrayList();
  315. if (supplyStockOutList.size() == 0 && supplyJudgementBillsList.size() == 0){
  316. return supplyParticularsList;
  317. }
  318. //将出库单根据物料编码进行分组
  319. Map<String, List<SupplyStockOut>> stockOutMaterialNumberListMap = this.groupSupplyStockOutMaterialNumber(supplyStockOutList);
  320. //将审定单根据物料编码进行分组
  321. Map<String, List<SupplyJudgementBills>> judgementBillsMaterialNumberListMap = this.groupSupplyJudgementBillsMaterialNumber(supplyJudgementBillsList);
  322. //获取所有审定单map对应的key键信息
  323. Set<String> supplyJudgementBillsListMapKeySet = judgementBillsMaterialNumberListMap.keySet();
  324. List<String> supplyJudgementBillsListMapKeyList = new ArrayList<>(supplyJudgementBillsListMapKeySet);
  325. //获取审定单中物料编码对应的出库单中的信息
  326. Iterator<String> supplyJudgementBillsListMapKey = supplyJudgementBillsListMapKeyList.iterator();
  327. while (supplyJudgementBillsListMapKey.hasNext()){
  328. String materialNumber = supplyJudgementBillsListMapKey.next();
  329. //获取审定单指定数据
  330. List<SupplyJudgementBills> judgementBillsList = judgementBillsMaterialNumberListMap.get(materialNumber);
  331. //因为相同物料编码的审定单数据仅存在一条,则通过下标获取特定审定单信息
  332. SupplyJudgementBills judgementBills = judgementBillsList.get(0);
  333. //获取出库单中对应的物料编码信息
  334. List<SupplyStockOut> stockOutMaterialNumberList = stockOutMaterialNumberListMap.get(materialNumber);
  335. //如果出库单中物料编码数据量大于0,则对数据进行处理
  336. if(null != stockOutMaterialNumberList && stockOutMaterialNumberList.size()>0){
  337. //如果出库单对应的物料编码数据量为一条,则将所有的审定数量均放在该数据中
  338. //如果存在多个并且审定数量高于该条出库单的实发数量 则最大值存放该出库单的实发数量,剩余的往后存放
  339. if(stockOutMaterialNumberList.size() == 1){
  340. SupplyStockOut stockOutMaterialNumber = stockOutMaterialNumberList.get(0);
  341. SupplyParticulars supplyParticulars = new SupplyParticulars();
  342. supplyParticulars.setMaterialsType(stockOutMaterialNumber.getMaterialsType());
  343. supplyParticulars.setExamineCount(judgementBills.getExamineCount());
  344. supplyParticulars.setBatch(stockOutMaterialNumber.getBatch());
  345. supplyParticulars.setMaterialNumber(stockOutMaterialNumber.getMaterialNumber());
  346. supplyParticulars.setMaterialDescription(stockOutMaterialNumber.getMaterialDescription());
  347. supplyParticulars.setUnit(stockOutMaterialNumber.getUnit());
  348. supplyParticulars.setActualQuantityIssued(stockOutMaterialNumber.getActualQuantityIssued());
  349. //审定数量(审定单D列审定数量 保留三位小数)
  350. BigDecimal examineCountB = new BigDecimal(judgementBills.getExamineCount());
  351. BigDecimal examineCountBs = examineCountB.setScale(3, BigDecimal.ROUND_HALF_UP);
  352. supplyParticulars.setExamineCount(examineCountBs.toString());
  353. //单价
  354. supplyParticulars.setUnitPrice(stockOutMaterialNumber.getUnitPrice());
  355. //超(欠)供数量(领用数量-实际耗用数量 当值为0时,显示‘-’)
  356. double examineCount = Double.parseDouble(supplyParticulars.getExamineCount());
  357. double actualQuantityIssued = Double.parseDouble(supplyParticulars.getActualQuantityIssued());
  358. BigDecimal unitPriceB = new BigDecimal(supplyParticulars.getUnitPrice());
  359. if(examineCount == actualQuantityIssued){
  360. supplyParticulars.setSupplyCount("-");
  361. //超(欠)供金额(超欠供数量*材料单价)
  362. supplyParticulars.setSupplyMoney("-");
  363. }else{
  364. supplyParticulars.setSupplyCount(String.valueOf(examineCount - actualQuantityIssued));
  365. //超(欠)供金额(超欠供数量*材料单价)
  366. BigDecimal supplyCountB = new BigDecimal(supplyParticulars.getSupplyCount());
  367. BigDecimal bigDecimal = supplyCountB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  368. supplyParticulars.setSupplyMoney(bigDecimal.toString());
  369. }
  370. supplyParticulars.setCommodityHandleTenet("");
  371. //计划列入工程投资的物资金额(审定数量*单价 金额保留2位小数)
  372. BigDecimal examineCountPB = new BigDecimal(supplyParticulars.getExamineCount());
  373. BigDecimal bigDecimal = examineCountPB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  374. supplyParticulars.setPlanMoney(bigDecimal.toString());
  375. //实际列入工程投资的物资金额
  376. BigDecimal actualQuantityIssuedB = new BigDecimal(supplyParticulars.getActualQuantityIssued());
  377. BigDecimal actualQuantityIssuedBigDecimal = actualQuantityIssuedB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  378. supplyParticulars.setPracticalMoney(actualQuantityIssuedBigDecimal.toString());
  379. supplyParticulars.setProjectDefinition("");
  380. supplyParticulars.setRemarks("");
  381. supplyParticularsList.add(supplyParticulars);
  382. }else {
  383. int size = stockOutMaterialNumberList.size();
  384. int forSize = 0;
  385. for (SupplyStockOut stockOutMaterialNumber :stockOutMaterialNumberList) {
  386. forSize +=1;
  387. SupplyParticulars supplyParticulars = new SupplyParticulars();
  388. supplyParticulars.setMaterialsType(stockOutMaterialNumber.getMaterialsType());
  389. supplyParticulars.setBatch(stockOutMaterialNumber.getBatch());
  390. supplyParticulars.setMaterialNumber(stockOutMaterialNumber.getMaterialNumber());
  391. supplyParticulars.setMaterialDescription(stockOutMaterialNumber.getMaterialDescription());
  392. supplyParticulars.setUnit(stockOutMaterialNumber.getUnit());
  393. supplyParticulars.setActualQuantityIssued(stockOutMaterialNumber.getActualQuantityIssued());
  394. double jExamineCount = Double.parseDouble(judgementBills.getExamineCount());
  395. double sActualQuantityIssued = Double.parseDouble(stockOutMaterialNumber.getActualQuantityIssued());
  396. //如果审定单审定数量超过了出库单出库数量,则将审定单中对应数量去除
  397. if(sActualQuantityIssued<jExamineCount){
  398. if(size == forSize){
  399. BigDecimal b = new BigDecimal(judgementBills.getExamineCount());
  400. BigDecimal f1 = b.setScale(3, BigDecimal.ROUND_HALF_UP);
  401. supplyParticulars.setExamineCount(String.valueOf(f1));
  402. }else{
  403. supplyParticulars.setExamineCount(stockOutMaterialNumber.getActualQuantityIssued());
  404. }
  405. double examineCountD = Double.parseDouble(judgementBills.getExamineCount());
  406. double actualQuantityIssuedD = Double.parseDouble(stockOutMaterialNumber.getActualQuantityIssued());
  407. double resultD = examineCountD - actualQuantityIssuedD;
  408. BigDecimal b = new BigDecimal(resultD);
  409. double f1 = b.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
  410. judgementBills.setExamineCount(String.valueOf(f1));
  411. }else{
  412. //审定数量(审定单D列审定数量 保留三位小数)
  413. BigDecimal examineCountB = new BigDecimal(judgementBills.getExamineCount());
  414. BigDecimal examineCountBs = examineCountB.setScale(3, BigDecimal.ROUND_HALF_UP);
  415. supplyParticulars.setExamineCount(examineCountBs.toString());
  416. judgementBills.setExamineCount("0.000");
  417. }
  418. //单价
  419. supplyParticulars.setUnitPrice(stockOutMaterialNumber.getUnitPrice());
  420. //超(欠)供数量(领用数量-实际耗用数量 当值为0时,显示‘-’)
  421. BigDecimal examineCountB = new BigDecimal(supplyParticulars.getExamineCount());
  422. BigDecimal actualQuantityIssuedB = new BigDecimal(supplyParticulars.getActualQuantityIssued());
  423. BigDecimal unitPriceB = new BigDecimal(supplyParticulars.getUnitPrice());
  424. if(examineCountB.compareTo(actualQuantityIssuedB) == 0){
  425. supplyParticulars.setSupplyCount("-");
  426. //超(欠)供金额(超欠供数量*材料单价)
  427. supplyParticulars.setSupplyMoney("-");
  428. }else{
  429. BigDecimal a = examineCountB.subtract(actualQuantityIssuedB).setScale(3, BigDecimal.ROUND_HALF_UP);
  430. supplyParticulars.setSupplyCount(String.valueOf(examineCountB.subtract(actualQuantityIssuedB).setScale(3, BigDecimal.ROUND_HALF_UP)));
  431. //超(欠)供金额(超欠供数量*材料单价)
  432. BigDecimal supplyCountB = new BigDecimal(supplyParticulars.getSupplyCount());
  433. BigDecimal bigDecimal = supplyCountB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  434. supplyParticulars.setSupplyMoney(bigDecimal.toString());
  435. }
  436. supplyParticulars.setCommodityHandleTenet("");
  437. //计划列入工程投资的物资金额(审定数量*单价 金额保留2位小数)
  438. BigDecimal examineCountPB = new BigDecimal(supplyParticulars.getExamineCount());
  439. BigDecimal bigDecimal = examineCountPB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  440. supplyParticulars.setPlanMoney(bigDecimal.toString());
  441. //实际列入工程投资的物资金额
  442. BigDecimal actualQuantityIssuedBigDecimal = actualQuantityIssuedB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  443. supplyParticulars.setPracticalMoney(actualQuantityIssuedBigDecimal.toString());
  444. supplyParticulars.setProjectDefinition("");
  445. supplyParticulars.setRemarks("");
  446. supplyParticularsList.add(supplyParticulars);
  447. }
  448. }
  449. }else{
  450. //如果出库单中物料编码数据量等于0,则表示物料审定后未出库,则没有单价
  451. //获取历史单价信息并进行求平均数。且不存储批次号
  452. SupplyParticulars supplyParticulars = new SupplyParticulars();
  453. supplyParticulars.setMaterialsType("-");
  454. supplyParticulars.setExamineCount(judgementBills.getExamineCount());
  455. supplyParticulars.setBatch(null);
  456. supplyParticulars.setMaterialNumber(judgementBills.getMaterialNumber());
  457. supplyParticulars.setMaterialDescription(judgementBills.getMaterialDescription());
  458. supplyParticulars.setUnit(judgementBills.getUnit());
  459. supplyParticulars.setActualQuantityIssued("0.000");
  460. //审定数量(审定单D列审定数量 保留三位小数)
  461. BigDecimal examineCountB = new BigDecimal(judgementBills.getExamineCount());
  462. BigDecimal examineCountBs = examineCountB.setScale(3, BigDecimal.ROUND_HALF_UP);
  463. supplyParticulars.setExamineCount(examineCountBs.toString());
  464. //单价
  465. //通过物料编码查询物料对应的平均价格
  466. String avgUtilPriceOnStockOutByMaterialNumber = mapper.getAvgUtilPriceOnStockOutByMaterialNumber(materialNumber);
  467. supplyParticulars.setUnitPrice(avgUtilPriceOnStockOutByMaterialNumber);
  468. //超(欠)供数量(领用数量-实际耗用数量 当值为0时,显示‘-’)
  469. double examineCount = Double.parseDouble(supplyParticulars.getExamineCount());
  470. double actualQuantityIssued = Double.parseDouble(supplyParticulars.getActualQuantityIssued());
  471. BigDecimal unitPriceB = new BigDecimal(supplyParticulars.getUnitPrice());
  472. if(examineCount == actualQuantityIssued){
  473. supplyParticulars.setSupplyCount("-");
  474. //超(欠)供金额(超欠供数量*材料单价)
  475. supplyParticulars.setSupplyMoney("-");
  476. }else{
  477. supplyParticulars.setSupplyCount(String.valueOf(examineCount - actualQuantityIssued));
  478. //超(欠)供金额(超欠供数量*材料单价)
  479. BigDecimal supplyCountB = new BigDecimal(supplyParticulars.getSupplyCount());
  480. BigDecimal bigDecimal = supplyCountB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  481. supplyParticulars.setSupplyMoney(bigDecimal.toString());
  482. }
  483. supplyParticulars.setCommodityHandleTenet("");
  484. //计划列入工程投资的物资金额(审定数量*单价 金额保留2位小数)
  485. BigDecimal examineCountPB = new BigDecimal(supplyParticulars.getExamineCount());
  486. BigDecimal bigDecimal = examineCountPB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  487. supplyParticulars.setPlanMoney(bigDecimal.toString());
  488. //实际列入工程投资的物资金额
  489. BigDecimal actualQuantityIssuedB = new BigDecimal(supplyParticulars.getActualQuantityIssued());
  490. BigDecimal actualQuantityIssuedBigDecimal = actualQuantityIssuedB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  491. supplyParticulars.setPracticalMoney(actualQuantityIssuedBigDecimal.toString());
  492. supplyParticulars.setProjectDefinition("");
  493. supplyParticulars.setRemarks("");
  494. supplyParticularsList.add(supplyParticulars);
  495. }
  496. //删除map中对应key键信息
  497. judgementBillsMaterialNumberListMap.remove(materialNumber);
  498. stockOutMaterialNumberListMap.remove(materialNumber);
  499. }
  500. //判断出库单(物料编码)Map是否还存在数据信息
  501. Set<String> stockOutMaterialNumberListMapKeySet = stockOutMaterialNumberListMap.keySet();
  502. if(stockOutMaterialNumberListMapKeySet.size()>0){
  503. List<String> stockOutMaterialNumberListMapKeyList = new ArrayList<>(stockOutMaterialNumberListMapKeySet);
  504. Iterator<String> stockOutMaterialNumberListMapKey = stockOutMaterialNumberListMapKeyList.iterator();
  505. while (stockOutMaterialNumberListMapKey.hasNext()){
  506. String materialNumber = stockOutMaterialNumberListMapKey.next();
  507. //获取出库单中对应的物料编码信息
  508. List<SupplyStockOut> stockOutMaterialNumberList = stockOutMaterialNumberListMap.get(materialNumber);
  509. //如果出库单中物料编码数据量大于0,则对数据进行处理
  510. if(stockOutMaterialNumberList.size()>0){
  511. for (SupplyStockOut stockOutMaterialNumber :stockOutMaterialNumberList) {
  512. SupplyParticulars supplyParticulars = new SupplyParticulars();
  513. supplyParticulars.setMaterialsType(stockOutMaterialNumber.getMaterialsType());
  514. supplyParticulars.setExamineCount("0.000");
  515. supplyParticulars.setBatch(stockOutMaterialNumber.getBatch());
  516. supplyParticulars.setMaterialNumber(stockOutMaterialNumber.getMaterialNumber());
  517. supplyParticulars.setMaterialDescription(stockOutMaterialNumber.getMaterialDescription());
  518. supplyParticulars.setUnit(stockOutMaterialNumber.getUnit());
  519. supplyParticulars.setActualQuantityIssued(stockOutMaterialNumber.getActualQuantityIssued());
  520. //审定数量(审定单D列审定数量 保留三位小数)
  521. BigDecimal examineCountB = new BigDecimal("0.000");
  522. BigDecimal examineCountBs = examineCountB.setScale(3, BigDecimal.ROUND_HALF_UP);
  523. supplyParticulars.setExamineCount(examineCountBs.toString());
  524. //单价
  525. supplyParticulars.setUnitPrice(stockOutMaterialNumber.getUnitPrice());
  526. //超(欠)供数量(领用数量-实际耗用数量 当值为0时,显示‘-’)
  527. double examineCount = Double.parseDouble(supplyParticulars.getExamineCount());
  528. double actualQuantityIssued = Double.parseDouble(supplyParticulars.getActualQuantityIssued());
  529. BigDecimal unitPriceB = new BigDecimal(supplyParticulars.getUnitPrice());
  530. if(examineCount == actualQuantityIssued){
  531. supplyParticulars.setSupplyCount("-");
  532. //超(欠)供金额(超欠供数量*材料单价)
  533. supplyParticulars.setSupplyMoney("-");
  534. }else{
  535. supplyParticulars.setSupplyCount(String.valueOf(examineCount - actualQuantityIssued));
  536. //超(欠)供金额(超欠供数量*材料单价)
  537. BigDecimal supplyCountB = new BigDecimal(supplyParticulars.getSupplyCount());
  538. BigDecimal bigDecimal = supplyCountB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  539. supplyParticulars.setSupplyMoney(bigDecimal.toString());
  540. }
  541. supplyParticulars.setCommodityHandleTenet("");
  542. //计划列入工程投资的物资金额(审定数量*单价 金额保留2位小数)
  543. BigDecimal examineCountPB = new BigDecimal(supplyParticulars.getExamineCount());
  544. BigDecimal bigDecimal = examineCountPB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  545. supplyParticulars.setPlanMoney(bigDecimal.toString());
  546. //实际列入工程投资的物资金额
  547. BigDecimal actualQuantityIssuedB = new BigDecimal(supplyParticulars.getActualQuantityIssued());
  548. BigDecimal actualQuantityIssuedBigDecimal = actualQuantityIssuedB.multiply(unitPriceB).setScale(2, BigDecimal.ROUND_HALF_UP);
  549. supplyParticulars.setPracticalMoney(actualQuantityIssuedBigDecimal.toString());
  550. supplyParticulars.setProjectDefinition("");
  551. supplyParticulars.setRemarks("");
  552. supplyParticularsList.add(supplyParticulars);
  553. }
  554. }
  555. //删除对应key
  556. stockOutMaterialNumberListMap.remove(materialNumber);
  557. }
  558. }
  559. return supplyParticularsList;
  560. }
  561. /**
  562. * 出库单(物料编码)数据分组
  563. * @param supplyStockOutList
  564. * @return
  565. */
  566. public Map<String,List<SupplyStockOut>> groupSupplyStockOutMaterialNumber (List<SupplyStockOut> supplyStockOutList){
  567. Map<String, List<SupplyStockOut>> map = new HashMap<>();
  568. for(SupplyStockOut stockOut : supplyStockOutList){
  569. if(map.containsKey(stockOut.getMaterialNumber())){//map中存在此id,将数据存放当前key的map中
  570. map.get(stockOut.getMaterialNumber()).add(stockOut);
  571. }else{//map中不存在,新建key,用来存放数据
  572. List<SupplyStockOut> tmpList = new ArrayList<>();
  573. tmpList.add(stockOut);
  574. map.put(stockOut.getMaterialNumber(), tmpList);
  575. }
  576. }
  577. return map;
  578. }
  579. /**
  580. * 审定单(物料编码)数据分组
  581. * @param supplyJudgementBillsList
  582. * @return
  583. */
  584. public Map<String,List<SupplyJudgementBills>> groupSupplyJudgementBillsMaterialNumber (List<SupplyJudgementBills> supplyJudgementBillsList){
  585. Map<String, List<SupplyJudgementBills>> map = new HashMap<>();
  586. for(SupplyJudgementBills stockOut : supplyJudgementBillsList){
  587. if(map.containsKey(stockOut.getMaterialNumber())){//map中存在此id,将数据存放当前key的map中
  588. map.get(stockOut.getMaterialNumber()).add(stockOut);
  589. }else{//map中不存在,新建key,用来存放数据
  590. List<SupplyJudgementBills> tmpList = new ArrayList<>();
  591. tmpList.add(stockOut);
  592. map.put(stockOut.getMaterialNumber(), tmpList);
  593. }
  594. }
  595. return map;
  596. }
  597. }