Browse Source

完成组合出库

lwx_dev
erdanergou 3 years ago
parent
commit
f874ef3192
  1. 54
      src/main/java/com/dreamchaser/depository_manage/controller/GroupController.java
  2. 9
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java
  3. 20
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  4. 1
      src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java
  5. 5
      src/main/java/com/dreamchaser/depository_manage/entity/GroupInfo.java
  6. 1
      src/main/java/com/dreamchaser/depository_manage/entity/MaterialAndPlace.java
  7. 9
      src/main/java/com/dreamchaser/depository_manage/mapper/PlaceMapper.java
  8. 43
      src/main/java/com/dreamchaser/depository_manage/mapper/PlaceMapper.xml
  9. 6
      src/main/java/com/dreamchaser/depository_manage/pojo/InventoryP.java
  10. 86
      src/main/java/com/dreamchaser/depository_manage/pojo/MaterialAndPlaceForView.java
  11. 7
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  12. 9
      src/main/java/com/dreamchaser/depository_manage/service/PlaceService.java
  13. 71
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java
  14. 309
      src/main/java/com/dreamchaser/depository_manage/service/impl/GroupServiceImpl.java
  15. 49
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  16. 15
      src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java
  17. 3
      src/main/java/com/dreamchaser/depository_manage/service/impl/SplitUnitServiceImpl.java
  18. 2
      src/main/resources/templates/pages/application/application-out.html
  19. 2
      src/main/resources/templates/pages/group/applicationOutForGroup.html
  20. 5
      src/test/java/com/dreamchaser/depository_manage/TestForOther.java
  21. 43
      target/classes/com/dreamchaser/depository_manage/mapper/PlaceMapper.xml
  22. 2
      target/classes/templates/pages/application/application-out.html
  23. 2
      target/classes/templates/pages/group/applicationOutForGroup.html

54
src/main/java/com/dreamchaser/depository_manage/controller/GroupController.java

@ -69,27 +69,24 @@ public class GroupController {
// 获取组合编码 // 获取组合编码
Group groupByCode = groupService.findGroupByCode(code); Group groupByCode = groupService.findGroupByCode(code);
StringBuilder errMsg = new StringBuilder();
if (groupByCode != null) { if (groupByCode != null) {
Map<String, Object> paramForGetGroup = new HashMap<>();
paramForGetGroup.put("gid", groupByCode.getId());
// 获取当前组合的所有物料数据 List<GroupInfo> groupByGid = groupService.findGroupInfoByGid(groupByCode.getId());
List<GroupInfo> groupByGid = groupService.findGroupByCondition(paramForGetGroup);
// 用于标识当前组合是否可以正常出库 // 用于标识当前组合是否可以正常出库
boolean flag = true; boolean flag = true;
for (int i = 0; i < groupByGid.size(); i++) { for (GroupInfo groupInfo : groupByGid) {
// 获取详细信息 // 获取详细信息
GroupInfo groupInfo = groupByGid.get(i);
// 获取该物料的库存 // 获取该物料的库存
List<Integer> inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo.getMid(), depositoryByAdminorg); List<Integer> inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo, depositoryByAdminorg);
// 用于标志当前物料库存是否符合要求 // 用于标志当前物料库存是否符合要求
boolean flagForQuantity = false; boolean flagForQuantity = false;
for (int j = 0; j < inventoryByMidAndDepository.size(); j++) { for (Integer quantity : inventoryByMidAndDepository) {
Integer quantity = inventoryByMidAndDepository.get(j);
// 如果库存符合要求 // 如果库存符合要求
if (quantity > groupInfo.getQuantity()) { if (quantity > groupInfo.getQuantity()) {
flagForQuantity = true; flagForQuantity = true;
@ -98,6 +95,7 @@ public class GroupController {
if (!flagForQuantity) { if (!flagForQuantity) {
// 如果当前不符合 // 如果当前不符合
flag = false; flag = false;
errMsg.append(" ").append(groupInfo.getMname()).append(" ");
break; break;
} }
@ -105,7 +103,7 @@ public class GroupController {
if (flag) { if (flag) {
return new RestResponse(groupByGid); return new RestResponse(groupByGid);
} else { } else {
return new RestResponse(null, 666, new StatusInfo("不能出库", "当前组合中有物料库存不足")); return new RestResponse(null, 666, new StatusInfo("不能出库", "当前组合中的 "+errMsg.toString()+"库存不足"));
} }
} else { } else {
return new RestResponse(null, 666, new StatusInfo("失败", "暂无该组合,请确认是否正确")); return new RestResponse(null, 666, new StatusInfo("失败", "暂无该组合,请确认是否正确"));
@ -328,18 +326,19 @@ public class GroupController {
// 获取当前组合的所有物料数据 // 获取当前组合的所有物料数据
List<GroupInfo> groupByGid = groupService.findGroupByCondition(map); List<GroupInfo> groupByGid = groupService.findGroupByCondition(map);
// 定义错误信息
StringBuilder errMsg = new StringBuilder();
// 用于标识当前组合是否可以正常出库 // 用于标识当前组合是否可以正常出库
boolean flag = true; boolean flag = true;
for (int i = 0; i < groupByGid.size(); i++) { for (GroupInfo groupInfo : groupByGid) {
// 获取详细信息 // 获取详细信息
GroupInfo groupInfo = groupByGid.get(i);
// 获取该物料的库存 // 获取该物料的库存
List<Integer> inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo.getMid(), depositoryByAdminorg); List<Integer> inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo, depositoryByAdminorg);
// 用于标志当前物料库存是否符合要求 // 用于标志当前物料库存是否符合要求
boolean flagForQuantity = false; boolean flagForQuantity = false;
for (int j = 0; j < inventoryByMidAndDepository.size(); j++) { for (Integer quantity : inventoryByMidAndDepository) {
Integer quantity = inventoryByMidAndDepository.get(j);
// 如果库存符合要求 // 如果库存符合要求
if (quantity > groupInfo.getQuantity()) { if (quantity > groupInfo.getQuantity()) {
flagForQuantity = true; flagForQuantity = true;
@ -348,6 +347,7 @@ public class GroupController {
if (!flagForQuantity) { if (!flagForQuantity) {
// 如果当前不符合 // 如果当前不符合
flag = false; flag = false;
errMsg.append(" ").append(groupInfo.getMname()).append(" ");
break; break;
} }
@ -355,7 +355,7 @@ public class GroupController {
if (flag) { if (flag) {
return new RestResponse(groupByGid); return new RestResponse(groupByGid);
} else { } else {
return new RestResponse(null, 666, new StatusInfo("不能出库", "当前组合中有物料库存不足")); return new RestResponse(null, 666, new StatusInfo("不能出库", "当前组合中的"+errMsg+"在仓库中库存不足"));
} }
} }
@ -499,7 +499,7 @@ public class GroupController {
} }
Object id = map.get("id"); // 获取主订单编号 Object id = map.get("id"); // 获取主订单编号
// 开启一个线程开启审批 // 开启一个线程开启审批
new Thread(new Runnable() { /* new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplate(crypt, userToken, ObjectFormatUtil.toInteger(id)); JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplate(crypt, userToken, ObjectFormatUtil.toInteger(id));
@ -511,7 +511,7 @@ public class GroupController {
// 设置过期为7天 // 设置过期为7天
redisTemplateForHash.expire(sp_no, 7, TimeUnit.DAYS); redisTemplateForHash.expire(sp_no, 7, TimeUnit.DAYS);
} }
}).start(); }).start();*/
if (integer != 0 && params.size() < 1) { if (integer != 0 && params.size() < 1) {
return CrudUtil.postHandle(integer, result); return CrudUtil.postHandle(integer, result);
@ -571,22 +571,23 @@ public class GroupController {
List<GroupInfo> groupInfoByGid = groupService.findGroupInfoByGid(gid); List<GroupInfo> groupInfoByGid = groupService.findGroupInfoByGid(gid);
// 用于标志该数量是否合法 // 用于标志该数量是否合法
boolean flag = true; boolean flag = true;
for (int i = 0; i < groupInfoByGid.size(); i++) { for (GroupInfo groupInfo : groupInfoByGid) {
// 获取具体信息 // 获取具体信息
GroupInfo groupInfo = groupInfoByGid.get(i);
// 获取本次要出库的实际的数量 // 获取本次要出库的实际的数量
Integer totalQuantity = groupInfo.getQuantity() * quantity; Integer totalQuantity = groupInfo.getQuantity() * quantity;
// 用于标志是否可以满足库存要求 // 用于标志是否可以满足库存要求
boolean flagForInventory = false; boolean flagForInventory = false;
// 获取该物料在各仓库的库存 // 获取该物料在各仓库的库存
List<Integer> inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo.getMid(), depositoryByAdminorg); List<Integer> inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo, depositoryByAdminorg);
for (int j = 0; j < inventoryByMidAndDepository.size(); j++) { for (Integer integer : inventoryByMidAndDepository) {
Integer integer = inventoryByMidAndDepository.get(j);
if (integer >= totalQuantity) { if (integer >= totalQuantity) {
flagForInventory = true; flagForInventory = true;
break; break;
} }
} }
if (!flagForInventory) { if (!flagForInventory) {
// 如果概述了不合法 // 如果概述了不合法
flag = false; flag = false;
@ -664,7 +665,6 @@ public class GroupController {
} }
} }
map.put("params", params); map.put("params", params);
} }
try { try {
integer += groupService.insertApplicationOutRecord(map, userToken); // 插入主订单 integer += groupService.insertApplicationOutRecord(map, userToken); // 插入主订单
@ -673,7 +673,7 @@ public class GroupController {
} }
Object id = map.get("id"); // 获取主订单编号 Object id = map.get("id"); // 获取主订单编号
// 开启一个线程开启审批 // 开启一个线程开启审批
new Thread(new Runnable() { /*new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplate(crypt, userToken, ObjectFormatUtil.toInteger(id)); JSONObject jsonObject = qyWxOperationService.sendOutApprovalTemplate(crypt, userToken, ObjectFormatUtil.toInteger(id));
@ -685,7 +685,7 @@ public class GroupController {
// 设置过期为7天 // 设置过期为7天
redisTemplateForHash.expire(sp_no, 7, TimeUnit.DAYS); redisTemplateForHash.expire(sp_no, 7, TimeUnit.DAYS);
} }
}).start(); }).start();*/
return CrudUtil.postHandle(integer, result); return CrudUtil.postHandle(integer, result);
} }

9
src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java

@ -618,7 +618,7 @@ public class MaterialController {
if ("-1".equals(unit)) { if ("-1".equals(unit)) {
// 如果是基础单位 // 如果是基础单位
for (InventoryP inventoryP : inventoryPList) { for (InventoryP inventoryP : inventoryPList) {
if (quantity <= inventoryP.getQuantity()) { // 如果当前数量合适则跳出循环 if (quantity <= (inventoryP.getQuantity() - inventoryP.getNumberOfTemporary())) { // 如果当前数量合适则跳出循环
flag = true; flag = true;
break; break;
} }
@ -636,7 +636,7 @@ public class MaterialController {
SplitInfo splitInfo = splitUnitService.findSplitInfoByMidAndUnit(paramForSplitInfo); SplitInfo splitInfo = splitUnitService.findSplitInfoByMidAndUnit(paramForSplitInfo);
// 获取最高级对应当前单位的数量 // 获取最高级对应当前单位的数量
int saveQuantity = inventoryP.getQuantity() * splitUnitService.findSplitInfoScaleQuantity(splitInfo, -1); int saveQuantity = (inventoryP.getQuantity() - inventoryP.getNumberOfTemporary()) * splitUnitService.findSplitInfoScaleQuantity(splitInfo, -1);
// 获取当前物料所在库位 // 获取当前物料所在库位
List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(inventoryP.getId(), depository.getId()); List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(inventoryP.getId(), depository.getId());
for (PlaceP p : for (PlaceP p :
@ -646,14 +646,13 @@ public class MaterialController {
if (placeAndMaterialByMidAndPid != null) { if (placeAndMaterialByMidAndPid != null) {
SplitInventory splitInventory = splitUnitService.findSplitInventoryByIidAndSid(placeAndMaterialByMidAndPid.getId(), splitInfo.getId()); SplitInventory splitInventory = splitUnitService.findSplitInventoryByIidAndSid(placeAndMaterialByMidAndPid.getId(), splitInfo.getId());
saveQuantity += splitInventory.getSaveQuantity(); saveQuantity += (splitInventory.getSaveQuantity() - splitInventory.getOutQuantity());
SplitInfo parentSplitInfo = splitUnitService.findSplitInfoById(splitInfo.getParentId()); SplitInfo parentSplitInfo = splitUnitService.findSplitInfoById(splitInfo.getParentId());
;
while (parentSplitInfo != null) { while (parentSplitInfo != null) {
splitInventory = splitUnitService.findSplitInventoryByIidAndSid(placeAndMaterialByMidAndPid.getId(), parentSplitInfo.getId()); splitInventory = splitUnitService.findSplitInventoryByIidAndSid(placeAndMaterialByMidAndPid.getId(), parentSplitInfo.getId());
splitInfo = splitUnitService.findSplitInfoByParentId(parentSplitInfo.getId()); splitInfo = splitUnitService.findSplitInfoByParentId(parentSplitInfo.getId());
saveQuantity += splitInventory.getSaveQuantity() * splitInfo.getQuantity(); saveQuantity += (splitInventory.getSaveQuantity() - splitInventory.getOutQuantity()) * splitInfo.getQuantity();
parentSplitInfo = splitUnitService.findSplitInfoById(parentSplitInfo.getParentId()); parentSplitInfo = splitUnitService.findSplitInfoById(parentSplitInfo.getParentId());
} }
} }

20
src/main/java/com/dreamchaser/depository_manage/controller/PageController.java

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PortConfig; import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.entity.MaterialAndPlace;
import com.dreamchaser.depository_manage.exception.MyException; import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.*; import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.security.bean.UserToken; import com.dreamchaser.depository_manage.security.bean.UserToken;
@ -1251,9 +1252,8 @@ public class PageController {
Double sumPrice = 0.0; Double sumPrice = 0.0;
// 计量单位 // 计量单位
StringBuffer sumUnit = new StringBuffer(); StringBuffer sumUnit = new StringBuffer();
for (int i = 0; i < applicationOutRecordMinByParent.size(); i++) { for (ApplicationOutRecordMin applicationOutRecordMin : applicationOutRecordMinByParent) {
// 获取子订单信息 // 获取子订单信息
ApplicationOutRecordMin applicationOutRecordMin = applicationOutRecordMinByParent.get(i);
// 获取出库物料信息 // 获取出库物料信息
Inventory materialById = materialService.findInventoryById(applicationOutRecordMin.getMid()); Inventory materialById = materialService.findInventoryById(applicationOutRecordMin.getMid());
// 获取出库物料仓库信息 // 获取出库物料仓库信息
@ -1293,21 +1293,17 @@ public class PageController {
depositoryManagerId = manager.split(","); depositoryManagerId = manager.split(",");
} }
List<UserByPort> depositoryManager = new ArrayList<>(); List<UserByPort> depositoryManager = new ArrayList<>();
String depositoryManagerNames = ""; StringBuilder depositoryManagerNames = new StringBuilder();
for (int i = 0; i < depositoryManagerId.length; i++) { for (String s : depositoryManagerId) {
Integer managerid = ObjectFormatUtil.toInteger(depositoryManagerId[i]); Integer managerid = ObjectFormatUtil.toInteger(s);
UserByPort user = LinkInterfaceUtil.FindUserById(managerid, userToken); UserByPort user = LinkInterfaceUtil.FindUserById(managerid, userToken);
depositoryManager.add(user); depositoryManager.add(user);
depositoryManagerNames += user.getName() + ","; depositoryManagerNames.append(user.getName()).append(",");
}
if (recordP.getPlaceId() != null) {
Place placeById = placeService.findPlaceById(recordP.getPlaceId());
recordP.setPCode(placeById.getCode());
} }
recordP.setPCode(placeCode.toString());
recordP.setApplicantTime(DateUtil.TimeStampToDateTime(Long.valueOf(recordP.getApplicantTime()))); recordP.setApplicantTime(DateUtil.TimeStampToDateTime(Long.valueOf(recordP.getApplicantTime())));
recordP.setDepartmentheadTime(DateUtil.TimeStampToDateTime(Long.valueOf(recordP.getDepartmentheadTime()))); recordP.setDepartmentheadTime(DateUtil.TimeStampToDateTime(Long.valueOf(recordP.getDepartmentheadTime())));
recordP.setDepositoryManagerName(depositoryManagerNames); recordP.setDepositoryManagerName(depositoryManagerNames.toString());
recordP.setApplicantName(userByPort.getName()); recordP.setApplicantName(userByPort.getName());
recordP.setDepartmentheadName(departmentHeadName.toString()); recordP.setDepartmentheadName(departmentHeadName.toString());
recordP.setMcode(mcode.toString()); recordP.setMcode(mcode.toString());

1
src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java

@ -2,6 +2,7 @@ package com.dreamchaser.depository_manage.controller;
import cn.hutool.core.lang.Snowflake; import cn.hutool.core.lang.Snowflake;
import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.entity.MaterialAndPlace;
import com.dreamchaser.depository_manage.exception.MyException; import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.*; import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.service.DepositoryService; import com.dreamchaser.depository_manage.service.DepositoryService;

5
src/main/java/com/dreamchaser/depository_manage/entity/GroupInfo.java

@ -94,4 +94,9 @@ public class GroupInfo {
* 组合名称 * 组合名称
*/ */
private String gname; private String gname;
/**
* 用于展示的计量单位
*/
private String showUnit;
} }

1
src/main/java/com/dreamchaser/depository_manage/entity/MaterialAndPlace.java

@ -36,4 +36,5 @@ public class MaterialAndPlace {
* 当前存放额度 * 当前存放额度
*/ */
private Integer quantity; private Integer quantity;
} }

9
src/main/java/com/dreamchaser/depository_manage/mapper/PlaceMapper.java

@ -2,6 +2,7 @@ package com.dreamchaser.depository_manage.mapper;
import com.dreamchaser.depository_manage.entity.MaterialAndPlace; import com.dreamchaser.depository_manage.entity.MaterialAndPlace;
import com.dreamchaser.depository_manage.entity.Place; import com.dreamchaser.depository_manage.entity.Place;
import com.dreamchaser.depository_manage.pojo.MaterialAndPlaceForView;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@ -134,6 +135,14 @@ public interface PlaceMapper {
* 根据库位获取当前库位所存储的物料 * 根据库位获取当前库位所存储的物料
*/ */
List<MaterialAndPlace> findPlaceAndMaterialByPid(Integer id); List<MaterialAndPlace> findPlaceAndMaterialByPid(Integer id);
/**
* 根据仓库id及物料id获取对应库位存储的物料
* @param map 待查询条件
* @return
*/
List<MaterialAndPlaceForView> findPlaceAndMaterialByDidAndMid(Map<String,Object> map);
/** /**
* 根据当前库位编号及物料编号获取具体库位 * 根据当前库位编号及物料编号获取具体库位
*/ */

43
src/main/java/com/dreamchaser/depository_manage/mapper/PlaceMapper.xml

@ -30,6 +30,27 @@
<result column="code" property="code" jdbcType="VARCHAR" /> <result column="code" property="code" jdbcType="VARCHAR" />
</resultMap> </resultMap>
<resultMap id="MaterialAndPlaceForViewMap" type="com.dreamchaser.depository_manage.pojo.MaterialAndPlaceForView">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="mid" property="mid" jdbcType="INTEGER" />
<result column="pid" property="pid" jdbcType="INTEGER" />
<result column="type_id" property="type_id" jdbcType="INTEGER" />
<result column="iid" property="iid" jdbcType="INTEGER" />
<result column="depository_id" property="depository_id" jdbcType="INTEGER" />
<result column="inventory" property="inventory" jdbcType="INTEGER" />
<result column="price" property="price" jdbcType="INTEGER" />
<result column="dcode" property="dcode" jdbcType="VARCHAR" />
<result column="dname" property="dname" jdbcType="VARCHAR" />
<result column="pcode" property="pcode" jdbcType="VARCHAR" />
<result column="texture" property="texture" jdbcType="VARCHAR" />
<result column="unit" property="unit" jdbcType="VARCHAR" />
<result column="version" property="version" jdbcType="VARCHAR" />
<result column="mcode" property="mcode" jdbcType="VARCHAR" />
<result column="tname" property="tname" jdbcType="VARCHAR" />
<result column="mname" property="mname" jdbcType="VARCHAR" />
<result column="adminorg" property="adminorg" jdbcType="VARCHAR" />
</resultMap>
<!-- 表查询字段 --> <!-- 表查询字段 -->
<sql id="allColumns"> <sql id="allColumns">
p.id,p.x,p.y,p.z,p.code,p.mid,p.did,p.min,p.max,p.state,p.quantity p.id,p.x,p.y,p.z,p.code,p.mid,p.did,p.min,p.max,p.state,p.quantity
@ -39,6 +60,10 @@
mp.id,mp.mid,mp.pid,mp.quantity,p.code,p.max,p.min,p.did mp.id,mp.mid,mp.pid,mp.quantity,p.code,p.max,p.min,p.did
</sql> </sql>
<sql id="allColumnsForView">
depository_id,mname,type_id,tname,mcode,version,price,unit,texture,pcode,dname,adminorg,dcode,iid,inventory,id,pid,mid
</sql>
<!-- 查询所有 --> <!-- 查询所有 -->
<select id="findPlaceAll" resultMap="placeMap"> <select id="findPlaceAll" resultMap="placeMap">
@ -74,6 +99,18 @@
</if> </if>
</select> </select>
<select id="findPlaceAndMaterialByDidAndMid" resultMap="MaterialAndPlaceForViewMap" parameterType="map">
select
<include refid="allColumnsForView"/>
FROM materialandplaceinfo WHERE 1 = 1
<if test="mid != '' and mid != null">
and mid = #{mid}
</if>
<if test="depositoryId != null and depositoryId != ''">
and depository_id = #{depositoryId}
</if>
</select>
<!-- 根据条件参数查询列表 --> <!-- 根据条件参数查询列表 -->
<select id="findPlaceByCondition" resultMap="placeMap" parameterType="map"> <select id="findPlaceByCondition" resultMap="placeMap" parameterType="map">
SELECT SELECT
@ -184,6 +221,12 @@
FROM materialandplace mp left join place p on p.id = mp.pid WHERE 1 = 1 and p.id = #{id} FROM materialandplace mp left join place p on p.id = mp.pid WHERE 1 = 1 and p.id = #{id}
</select> </select>
<select id="findPlaceAndMaterialByDidAndMid" resultMap="materialAndPlaceMap" parameterType="int">
SELECT
<include refid="allColumnsByMaterialAndPlace" />
FROM materialandplace mp left join place p on p.id = mp.pid WHERE 1 = 1 and p.id = #{id}
</select>
<select id="findPlaceAndMaterialByMidAndPid" resultMap="materialAndPlaceMap" parameterType="map"> <select id="findPlaceAndMaterialByMidAndPid" resultMap="materialAndPlaceMap" parameterType="map">
SELECT SELECT
<include refid="allColumnsByMaterialAndPlace" /> <include refid="allColumnsByMaterialAndPlace" />

6
src/main/java/com/dreamchaser/depository_manage/pojo/InventoryP.java

@ -179,7 +179,10 @@ public class InventoryP {
private Map<String,Integer> showQuantity; private Map<String,Integer> showQuantity;
/**
* 暂存额度
*/
private Integer numberOfTemporary;
@ -211,6 +214,7 @@ public class InventoryP {
this.brand = inventory.getBrand(); // 品牌 this.brand = inventory.getBrand(); // 品牌
this.remark = inventory.getRemark(); // 备注 this.remark = inventory.getRemark(); // 备注
this.shelfLifeForCalc = inventory.getShelfLife(); //保质期,用于计算 this.shelfLifeForCalc = inventory.getShelfLife(); //保质期,用于计算
this.numberOfTemporary = inventory.getNumberOfTemporary(); // 临时数量(出库数量)
} }
public InventoryP() { public InventoryP() {

86
src/main/java/com/dreamchaser/depository_manage/pojo/MaterialAndPlaceForView.java

@ -0,0 +1,86 @@
package com.dreamchaser.depository_manage.pojo;
import lombok.Data;
@Data
public class MaterialAndPlaceForView {
/**
* 物料与库位映射关系id
*/
private Integer id;
/**
* 物料id
*/
private Integer mid;
/**
* 当前库存id
*/
private Integer pid;
/**
* 在当前库位的数量
*/
private Integer inventory;
/**
* 当前库存所处仓库
*/
private Integer depository_id;
/**
* 当前物料类型id
*/
private Integer type_id;
/**
* 库存id
*/
private Integer iid;
/**
* 所处仓库编码
*/
private String dcode;
/**
* 所处仓库名称
*/
private String dname;
/**
* 物料所处库位编码
*/
private String pcode;
/**
* 物料材质
*/
private String texture;
/**
* 物料计量单位
*/
private String unit;
/**
* 物料规格型号
*/
private String version;
/**
* 物料单价
*/
private Integer price;
/**
* 物料编码
*/
private String mcode;
/**
* 当前物料类型名称
*/
private String tname;
/**
* 当前仓库所属部门
*/
private String adminorg;
/**
* 物料名称
*/
private String mname;
}

7
src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java

@ -124,12 +124,13 @@ public interface MaterialService {
List<Inventory> findInventoryByMid(int mid); List<Inventory> findInventoryByMid(int mid);
/** /**
* 根据物料id获取其在对应仓库中的库存数 * 根据套餐详情获取其在对应仓库中的库存数
* @param mid 物料id *
* @param groupInfo 套餐详情
* @param depositoryList 待查询的仓库 * @param depositoryList 待查询的仓库
* @return * @return
*/ */
List<Integer> findInventoryByMidAndDepository(Integer mid,List<Depository> depositoryList); List<Integer> findInventoryByMidAndDepository(GroupInfo groupInfo,List<Depository> depositoryList);
/** /**
* 根据id查询库存信息 * 根据id查询库存信息

9
src/main/java/com/dreamchaser/depository_manage/service/PlaceService.java

@ -3,6 +3,7 @@ package com.dreamchaser.depository_manage.service;
import com.dreamchaser.depository_manage.entity.MaterialAndPlace; import com.dreamchaser.depository_manage.entity.MaterialAndPlace;
import com.dreamchaser.depository_manage.entity.PidOrDidAndCode; import com.dreamchaser.depository_manage.entity.PidOrDidAndCode;
import com.dreamchaser.depository_manage.entity.Place; import com.dreamchaser.depository_manage.entity.Place;
import com.dreamchaser.depository_manage.pojo.MaterialAndPlaceForView;
import com.dreamchaser.depository_manage.pojo.PlaceP; import com.dreamchaser.depository_manage.pojo.PlaceP;
import java.util.List; import java.util.List;
@ -107,6 +108,14 @@ public interface PlaceService {
*/ */
List<MaterialAndPlace> findPlaceAndMaterialByPid(Integer id); List<MaterialAndPlace> findPlaceAndMaterialByPid(Integer id);
/**
* 根据仓库id及物料id获取对应库位存储的物料
* @param did 待查询仓库id
* @param mid 物料id
* @return
*/
List<MaterialAndPlaceForView> findPlaceAndMaterialByDidAndMid(Integer did, Integer mid);
/** /**
* 根据当前库位编号及物料编号获取具体库位 * 根据当前库位编号及物料编号获取具体库位
*/ */

71
src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java

@ -3,6 +3,7 @@ package com.dreamchaser.depository_manage.service.impl;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PortConfig; import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.entity.MaterialAndPlace;
import com.dreamchaser.depository_manage.exception.MyException; import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.mapper.*; import com.dreamchaser.depository_manage.mapper.*;
import com.dreamchaser.depository_manage.pojo.*; import com.dreamchaser.depository_manage.pojo.*;
@ -199,7 +200,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
if (placeId == null || "".equals(placeId) || "0".equals(placeId)) { if (placeId == null || "".equals(placeId) || "0".equals(placeId)) {
map.put("placeId", 0); map.put("placeId", 0);
} }
Double quantity = Double.parseDouble((String) map.get("quantity")); double quantity = Double.parseDouble((String) map.get("quantity"));
Long time = DateUtil.DateTimeToTimeStamp(DateUtil.getSimpleTime(new Date())); Long time = DateUtil.DateTimeToTimeStamp(DateUtil.getSimpleTime(new Date()));
map.put("applicantTime", time); map.put("applicantTime", time);
Integer mid = ObjectFormatUtil.toInteger(map.get("mid")); Integer mid = ObjectFormatUtil.toInteger(map.get("mid"));
@ -211,14 +212,6 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
Inventory materialById = materialMapper.findInventoryById(mid); Inventory materialById = materialMapper.findInventoryById(mid);
int amounts = (int) ((materialById.getPrice() / 100) * quantity * 100); int amounts = (int) ((materialById.getPrice() / 100) * quantity * 100);
map.put("price", amounts); map.put("price", amounts);
Map<String, Object> update = new HashMap<>();
update.put("id", materialById.getId());
Integer numberOfTemporary = materialById.getNumberOfTemporary();
if (numberOfTemporary == null) {
numberOfTemporary = 0;
}
update.put("numberOfTemporary", numberOfTemporary + quantity);
materialMapper.updateMaterial(update);
Depository depositoryRecordById = depositoryMapper.findDepositoryById(materialById.getDepositoryId()); Depository depositoryRecordById = depositoryMapper.findDepositoryById(materialById.getDepositoryId());
dname = depositoryRecordById.getDname(); dname = depositoryRecordById.getDname();
} }
@ -684,11 +677,20 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Integer insertApplicationOutMin(Map<String, Object> map) { public Integer insertApplicationOutMin(Map<String, Object> map) {
// 获取当前出库库存id
Integer mid = ObjectFormatUtil.toInteger(map.get("mid")); Integer mid = ObjectFormatUtil.toInteger(map.get("mid"));
Inventory materialById = materialMapper.findInventoryById(mid); // 获取当前出库库存记录
map.put("depositoryId", materialById.getDepositoryId()); Inventory inventoryById = materialMapper.findInventoryById(mid);
map.put("depositoryId", inventoryById.getDepositoryId());
map.put("trueOut", 0); map.put("trueOut", 0);
// 获取出库数量
Integer quantity = ObjectFormatUtil.toInteger(map.get("quantity"));
// 设置当前暂时出库数量
inventoryById.setNumberOfTemporary(quantity);
// 修改库存记录
materialMapper.updateInventory(inventoryById);
return depositoryRecordMapper.insertApplicationOutRecordMin(map); return depositoryRecordMapper.insertApplicationOutRecordMin(map);
} }
@ -894,7 +896,8 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
restResponse.setData(""); restResponse.setData("");
restResponse.setStatusInfo(new StatusInfo("出库失败", "出库失败,库存不足")); restResponse.setStatusInfo(new StatusInfo("出库失败", "出库失败,库存不足"));
} }
} else { }
else {
// 如果是拆单后的出库 // 如果是拆单后的出库
// 用于获取对应的拆单记录 // 用于获取对应的拆单记录
@ -1807,8 +1810,10 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 将主订单插入到redis中 // 将主订单插入到redis中
redisTemplate.opsForHash().put("record:" + recordP.getId(), "minRecord", minRecordByMain.toString()); redisTemplate.opsForHash().put("record:" + recordP.getId(), "minRecord", minRecordByMain.toString());
map.put("state", "仓储中心负责人审核通过"); map.put("state", "仓储中心负责人审核通过");
} else { }
else {
// 如果是不通过 // 如果是不通过
updateInventoryForOutRefused(recordP);
map.put("depositoryManagerPass", 2); map.put("depositoryManagerPass", 2);
map.put("pass", 2); map.put("pass", 2);
map.put("state", "仓储中心负责人审核未通过"); map.put("state", "仓储中心负责人审核未通过");
@ -1845,6 +1850,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("depositoryManager", depositoryManager.toString()); map.put("depositoryManager", depositoryManager.toString());
} else { } else {
// 如果点击的是驳回 // 如果点击的是驳回
updateInventoryForOutRefused(recordP);
map.put("pass", 2); map.put("pass", 2);
map.put("departmentheadPass", 2); map.put("departmentheadPass", 2);
map.put("state", "部门负责人审核未通过"); map.put("state", "部门负责人审核未通过");
@ -1922,6 +1928,37 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
return depositoryRecordMapper.insertApplicationOutRecordMin(map); return depositoryRecordMapper.insertApplicationOutRecordMin(map);
} }
/**
* 用于修改拒绝了的出库订单中的库存记录
* @param recordP 拒绝的订单
*/
private void updateInventoryForOutRefused(ApplicationOutRecordP recordP){
// 获取该订单下的子订单
List<ApplicationOutRecordMin> recordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(recordP.getId());
// 循环该记录
for (ApplicationOutRecordMin recordMin:
recordMinByParent) {
// 获取出库时的计量单位
String unit = recordMin.getUnit();
// 获取库存记录
Integer mid = recordMin.getMid();
if("-1".equals(unit)){
// 如果出库时选中的为基础单位
// 获取库存记录
Inventory inventoryById = materialMapper.findInventoryById(mid);
// 设置该库存记录的暂存数量
inventoryById.setNumberOfTemporary(inventoryById.getNumberOfTemporary() - recordMin.getQuantity());
// 修改库存记录
materialMapper.updateInventory(inventoryById);
}
}
}
/** /**
* 审核申请 * 审核申请
* *
@ -1975,7 +2012,10 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
}).start(); }).start();
} else { }
else {
// 如果没有通过
updateInventoryForOutRefused(record);
result = "驳回"; result = "驳回";
map.put("pass", 2); map.put("pass", 2);
map.put("state", "部门负责人审核未通过"); map.put("state", "部门负责人审核未通过");
@ -2164,6 +2204,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
redisTemplate.opsForHash().put("record:" + record.getId(), "minRecord", minRecordByMain.toString()); redisTemplate.opsForHash().put("record:" + record.getId(), "minRecord", minRecordByMain.toString());
map.put("state", "仓储中心负责人审核通过"); map.put("state", "仓储中心负责人审核通过");
} else { } else {
updateInventoryForOutRefused(record);
result = "驳回"; result = "驳回";
map.put("pass", 2); map.put("pass", 2);
map.put("state", "仓储中心负责人审核未通过"); map.put("state", "仓储中心负责人审核未通过");
@ -2250,6 +2291,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 设置过期时间为三天 // 设置过期时间为三天
redisTemplate.expire("user:" + userByPort.getNumber() + ":QyWxOutId:" + outId, 72, TimeUnit.HOURS); redisTemplate.expire("user:" + userByPort.getNumber() + ":QyWxOutId:" + outId, 72, TimeUnit.HOURS);
} else { } else {
updateInventoryForOutRefused(recordP);
// 如果点击的是驳回 // 如果点击的是驳回
map.put("pass", 2); map.put("pass", 2);
map.put("departmentheadPass", 2); map.put("departmentheadPass", 2);
@ -2375,6 +2417,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("state", "仓储中心负责人审核通过"); map.put("state", "仓储中心负责人审核通过");
} else { } else {
// 如果是不通过 // 如果是不通过
updateInventoryForOutRefused(recordP);
map.put("depositoryManagerPass", 2); map.put("depositoryManagerPass", 2);
map.put("pass", 2); map.put("pass", 2);
map.put("state", "仓储中心负责人审核未通过"); map.put("state", "仓储中心负责人审核未通过");

309
src/main/java/com/dreamchaser/depository_manage/service/impl/GroupServiceImpl.java

@ -2,12 +2,11 @@ package com.dreamchaser.depository_manage.service.impl;
import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException; import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.mapper.DepositoryMapper; import com.dreamchaser.depository_manage.mapper.*;
import com.dreamchaser.depository_manage.mapper.DepositoryRecordMapper;
import com.dreamchaser.depository_manage.mapper.GroupMapper;
import com.dreamchaser.depository_manage.mapper.MaterialMapper;
import com.dreamchaser.depository_manage.pojo.GroupInfoP; import com.dreamchaser.depository_manage.pojo.GroupInfoP;
import com.dreamchaser.depository_manage.pojo.MaterialAndPlaceForView;
import com.dreamchaser.depository_manage.service.GroupService; import com.dreamchaser.depository_manage.service.GroupService;
import com.dreamchaser.depository_manage.service.SplitUnitService;
import com.dreamchaser.depository_manage.utils.DateUtil; import com.dreamchaser.depository_manage.utils.DateUtil;
import com.dreamchaser.depository_manage.utils.LinkInterfaceUtil; import com.dreamchaser.depository_manage.utils.LinkInterfaceUtil;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
@ -33,16 +32,21 @@ public class GroupServiceImpl implements GroupService {
@Autowired @Autowired
DepositoryRecordMapper depositoryRecordMapper; DepositoryRecordMapper depositoryRecordMapper;
@Autowired
DepositoryMapper depositoryMapper;
@Autowired
RedissonClient redissonClient;
@Autowired
RedisTemplate<String, String> redisTemplate;
@Autowired @Autowired
private RedissonClient redissonClient; SplitUnitMapper splitUnitMapper;
@Autowired @Autowired
private RedisTemplate<String, String> redisTemplate; SplitUnitService splitUnitService;
@Autowired @Autowired
DepositoryMapper depositoryMapper; PlaceMapper placeMapper;
/** /**
* 用于查找所有组合 * 用于查找所有组合
@ -56,6 +60,7 @@ public class GroupServiceImpl implements GroupService {
/** /**
* 根据组合id获取具体信息 * 根据组合id获取具体信息
*
* @param gid 组合id * @param gid 组合id
* @return * @return
*/ */
@ -66,6 +71,7 @@ public class GroupServiceImpl implements GroupService {
/** /**
* 根据组合id查询对应组合 * 根据组合id查询对应组合
*
* @param gid 组合id * @param gid 组合id
* @return * @return
*/ */
@ -76,6 +82,7 @@ public class GroupServiceImpl implements GroupService {
/** /**
* 用于添加组合与二维码的对应关系 * 用于添加组合与二维码的对应关系
*
* @param map 具体添加数据 * @param map 具体添加数据
* @return * @return
*/ */
@ -107,7 +114,9 @@ public class GroupServiceImpl implements GroupService {
for (GroupInfo groupInfo : groupByCondition) { for (GroupInfo groupInfo : groupByCondition) {
if ("-1".equals(groupInfo.getUnit())) { if ("-1".equals(groupInfo.getUnit())) {
Material material = materialMapper.findMaterialById(groupInfo.getMid()); Material material = materialMapper.findMaterialById(groupInfo.getMid());
groupInfo.setUnit(material.getUnit()); groupInfo.setShowUnit(material.getUnit());
} else {
groupInfo.setShowUnit(groupInfo.getUnit());
} }
} }
return groupByCondition; return groupByCondition;
@ -543,14 +552,19 @@ public class GroupServiceImpl implements GroupService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Integer insertApplicationOutRecord(Map<String, Object> map, UserByPort userToken) { public Integer insertApplicationOutRecord(Map<String, Object> map, UserByPort userToken) {
// 用于存储出库数据 // 用于存储出库数据
Map<String, Object> paramForOut = new HashMap<>(); Map<String, Object> paramForOut = new HashMap<>();
paramForOut.put("departmenthead", map.get("departmenthead")); paramForOut.put("departmenthead", map.get("departmenthead"));
paramForOut.put("applicantId", userToken.getId()); paramForOut.put("applicantId", userToken.getId());
// 获取当前提交数 // 获取当前提交数
List<String> params = (List<String>) map.get("params"); List<String> params = (List<String>) map.get("params");
// 用于存储申请数 // 用于存储申请数
Integer result = 0; Integer result = 0;
// 定义出库订单的主订单编号
Object parentId = null; Object parentId = null;
// 获取当前要出库的组合数量 // 获取当前要出库的组合数量
@ -560,19 +574,57 @@ public class GroupServiceImpl implements GroupService {
// 获取要出库组合的具体信息 // 获取要出库组合的具体信息
List<GroupInfo> groupInfoByGid = groupMapper.findGroupInfoByGid(gid); List<GroupInfo> groupInfoByGid = groupMapper.findGroupInfoByGid(gid);
// 获取当前部门所拥有的仓库
List<Depository> depositoryByAdminorg = depositoryMapper.findDepositoryByAdminorg(userToken.getMaindeparment().toString());
// 用于统计出库物料总数 // 用于统计出库物料总数
Integer quantityForTotal = 0; Integer quantityForTotal = 0;
// 用于统计出库物料金额总数 // 用于统计出库物料金额总数
double priceForTotal = 0; double priceForTotal = 0;
// 循环遍历当前部门所拥有的仓库
for (Depository depository :
depositoryByAdminorg) {
// 用于获取当前物料库存信息
Map<String, Object> paramForMidAndDid = new HashMap<>();
paramForMidAndDid.put("depositoryId", depository.getId());
// 遍历当前组合中的详细信息
for (GroupInfo groupInfo : groupInfoByGid) { for (GroupInfo groupInfo : groupInfoByGid) {
// 获取具体信息 // 获取具体信息
// 获取当前物料库存信息
Map<String, Object> paramForMid = new HashMap<>(); // 获取当前单位
paramForMid.put("mid", groupInfo.getMid()); String unit = groupInfo.getUnit();
List<Inventory> inventory = materialMapper.findInventory(paramForMid); paramForMidAndDid.put("mid", groupInfo.getMid());
List<Inventory> inventory = materialMapper.findInventory(paramForMidAndDid);
if ("-1".equals(unit)) {
// 如果当前是基础单位
if (inventory.size() > 0) {
quantityForTotal += quantityForGroup * groupInfo.getQuantity(); quantityForTotal += quantityForGroup * groupInfo.getQuantity();
priceForTotal += inventory.get(0).getPrice() * 100 * quantityForGroup; priceForTotal += inventory.get(0).getPrice() * 100 * quantityForGroup;
paramForOut.put("depositoryId", depository.getId());
break;
}
} else {
// 如果是拆单单位
// 用于获取当前拆单单位
Map<String, Object> paramForSplitInfo = new HashMap<>();
paramForSplitInfo.put("newUnit", unit);
paramForSplitInfo.put("mid", groupInfo.getMid());
// 获取拆单记录
SplitInfo splitInfo = splitUnitMapper.findSplitInfoByMidAndUnit(paramForSplitInfo);
/// 获取当前拆单与基础单位之间的进制
int scale = splitUnitService.findSplitInfoScaleQuantity(splitInfo, -1);
if (inventory.size() > 0) {
quantityForTotal += quantityForGroup * groupInfo.getQuantity();
priceForTotal += inventory.get(0).getPrice() * 100 / scale * quantityForGroup;
paramForOut.put("depositoryId", depository.getId());
break;
}
}
}
} }
paramForOut.put("quantity", quantityForTotal); paramForOut.put("quantity", quantityForTotal);
paramForOut.put("price", priceForTotal); paramForOut.put("price", priceForTotal);
@ -580,14 +632,17 @@ public class GroupServiceImpl implements GroupService {
paramForOut.put("istransfer", 2); paramForOut.put("istransfer", 2);
paramForOut.put("state", "待部门负责人审核"); paramForOut.put("state", "待部门负责人审核");
paramForOut.put("applyRemark", map.get("applyRemark")); paramForOut.put("applyRemark", map.get("applyRemark"));
// 获取当前部门名称
Administration company = LinkInterfaceUtil.getCompany(userToken.getMaindeparment(), userToken); Administration company = LinkInterfaceUtil.getCompany(userToken.getMaindeparment(), userToken);
// 构造出库订单编码 // 构造出库订单编码
String code = createOutCode("outOrderNumber", company.getName()); String code = createOutCode("outOrderNumber", company.getName());
paramForOut.put("code", code); paramForOut.put("code", code);
paramForOut.put("pass", 3); paramForOut.put("pass", 3);
// 插入一条出库订单的主订单
depositoryRecordMapper.insertApplicationOutRecord(paramForOut); depositoryRecordMapper.insertApplicationOutRecord(paramForOut);
parentId = paramForOut.get("id"); parentId = paramForOut.get("id");
// 插入子订单
result += insertApplicationOutMinRecord(userToken, code, parentId, gid, quantityForGroup); result += insertApplicationOutMinRecord(userToken, code, parentId, gid, quantityForGroup);
if (params != null && params.size() > 0) { if (params != null && params.size() > 0) {
@ -636,19 +691,27 @@ public class GroupServiceImpl implements GroupService {
// 获取当前部门仓库 // 获取当前部门仓库
List<Depository> depositoryByAdminorg = depositoryMapper.findDepositoryByAdminorg(userToken.getMaindeparment().toString()); List<Depository> depositoryByAdminorg = depositoryMapper.findDepositoryByAdminorg(userToken.getMaindeparment().toString());
// 获取要出库组合的具体信息 // 获取要出库组合的具体信息
List<GroupInfo> groupInfoByGid = groupMapper.findGroupInfoByGid(gid); List<GroupInfo> groupInfoByGid = groupMapper.findGroupInfoByGid(gid);
// 循环所有详细信息
for (GroupInfo groupInfo : groupInfoByGid) { for (GroupInfo groupInfo : groupInfoByGid) {
// 用于存储出库数据
Map<String, Object> paramForOutMin = new HashMap<>();
paramForOutMin.put("parentId", parentId);
// 组合中的具体信息 // 组合中的具体信息
// 实际要出库的物料库存数量 // 实际要出库的物料库存数量
Integer quantity = groupInfo.getQuantity() * quantityForGroup; Integer quantity = groupInfo.getQuantity() * quantityForGroup;
// 定义出库时的单位
String unit = groupInfo.getUnit();
// 实际出库的仓库编号 // 实际出库的仓库编号
int did = -1; int did = -1;
// 实际出库的库存编号 // 实际出库的库存编号
int mid = -1; int mid = -1;
if ("-1".equals(unit)) {
// 如果是基础单位
// 用于查询各仓库中对应物料的库存 // 用于查询各仓库中对应物料的库存
Map<String, Object> paramForInventory = new HashMap<>(); Map<String, Object> paramForInventory = new HashMap<>();
paramForInventory.put("mid", groupInfo.getMid()); paramForInventory.put("mid", groupInfo.getMid());
@ -657,16 +720,66 @@ public class GroupServiceImpl implements GroupService {
paramForInventory.put("did", depository.getId()); paramForInventory.put("did", depository.getId());
// 获取对应库存 // 获取对应库存
Inventory inventoryByMidAndDid = materialMapper.findInventoryByMidAndDid(paramForInventory); Inventory inventoryByMidAndDid = materialMapper.findInventoryByMidAndDid(paramForInventory);
if (inventoryByMidAndDid.getQuantity() > quantity) { if (inventoryByMidAndDid.getQuantity() >= quantity) {
// 如果当前库存充足 // 如果当前库存充足
did = depository.getId(); did = depository.getId();
mid = inventoryByMidAndDid.getId(); mid = inventoryByMidAndDid.getId();
break; break;
} }
} }
} else {
// 如果是拆单单位
// 用于获取拆单信息
Map<String, Object> paramForSplitInfo = new HashMap<>();
paramForSplitInfo.put("newUnit", unit);
paramForSplitInfo.put("mid", groupInfo.getMid());
// 获取拆单信息
SplitInfo splitInfo = splitUnitMapper.findSplitInfoByMidAndUnit(paramForSplitInfo);
// 用于获取物料与库位的对应关系
Map<String, Object> paramForPlace = new HashMap<>();
// 待查询物料
paramForPlace.put("mid", groupInfo.getMid());
for (Depository depository : depositoryByAdminorg) {
paramForPlace.put("depositoryId", depository.getId());
// 获取当前仓库中该物料与库位的对应关系
List<MaterialAndPlaceForView> materialAndPlaceForViews = placeMapper.findPlaceAndMaterialByDidAndMid(paramForPlace);
// 定义标志位用于判断是否跳出循环
boolean flag = false;
for (MaterialAndPlaceForView materialAndPlaceForView :
materialAndPlaceForViews) {
// 定义物料与库位的对应关系
MaterialAndPlace mp = new MaterialAndPlace();
// 设置id
mp.setId(materialAndPlaceForView.getId());
// 设置数量
mp.setQuantity(materialAndPlaceForView.getInventory());
// 获取当前库位下该拆单单位库存数
int allInventoryForSplitInfo = splitUnitService.findAllInventoryForSplitInfo(-1, mp, splitInfo.getId(), 0, true);
if (allInventoryForSplitInfo >= quantity) {
// 如果当前库存充足
did = materialAndPlaceForView.getDepository_id();
mid = materialAndPlaceForView.getIid();
flag = true;
break;
}
}
if (flag) {
break;
}
}
}
if (did != -1) { if (did != -1) {
// 如果有正确的仓库 // 如果有正确的仓库
// 用于存储出库数据
Map<String, Object> paramForOutMin = new HashMap<>();
paramForOutMin.put("parentId", parentId);
paramForOutMin.put("depositoryId", did); paramForOutMin.put("depositoryId", did);
paramForOutMin.put("unit", groupInfo.getUnit());
paramForOutMin.put("mid", mid); paramForOutMin.put("mid", mid);
paramForOutMin.put("trueOut", 0); paramForOutMin.put("trueOut", 0);
paramForOutMin.put("quantity", quantity); paramForOutMin.put("quantity", quantity);
@ -689,7 +802,90 @@ public class GroupServiceImpl implements GroupService {
*/ */
@Override @Override
public List<GroupInfo> findGroupInfoByGid(Integer gid) { public List<GroupInfo> findGroupInfoByGid(Integer gid) {
return groupMapper.findGroupInfoByGid(gid); List<GroupInfo> groupInfoByGid = groupMapper.findGroupInfoByGid(gid);
for (GroupInfo groupInfo :
groupInfoByGid) {
if ("-1".equals(groupInfo.getUnit())) {
Material material = materialMapper.findMaterialById(groupInfo.getMid());
groupInfo.setShowUnit(material.getUnit());
} else {
groupInfo.setShowUnit(groupInfo.getUnit());
}
}
return groupInfoByGid;
}
/**
* 构造树形组件数据模板
*
* @param g 组合
* @param children 子类
* @return
*/
public Map<String, Object> InitTreeMenus(Group g, List<Object> children) {
if (g != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", g.getGname());
map.put("id", g.getId());
map.put("children", children);
return map;
} else {
return null;
}
}
/**
* 构造树形组件的子组件模板
*
* @param g 组合详细信息
* @return
*/
public Map<String, Object> InitTreeMenus(GroupInfo g) {
if (g != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", g.getMname() + ",数量:" + g.getQuantity());
map.put("id", g.getId());
return map;
} else {
return null;
}
}
/**
* 用于创建组合编码
*
* @param num 第几个组合
* @return
*/
public String createCode(Integer num) {
String code = String.format("%04d", num + 1);
return code;
}
/**
* 生成出库单号
*
* @return
*/
private String createOutCode(String key, String mainDeparmentName) {
RLock lock = redissonClient.getLock(key);
// 入库单号(公司简称+仓库简称+年月日+数字(位数设置>=9))
String code = "GK";
String nowTime = DateUtil.getNowTime();
lock.lock(5, TimeUnit.SECONDS);
String orderNumber = redisTemplate.opsForValue().get(key);
if (orderNumber == null) {
redisTemplate.opsForValue().set(key, "1", DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS);
orderNumber = "1";
}
int newNumber = ObjectFormatUtil.toInteger(orderNumber) + 1;
redisTemplate.boundValueOps(key).set(String.valueOf(newNumber), DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS);
lock.unlock();
orderNumber = String.format("%09d", ObjectFormatUtil.toInteger(orderNumber));
mainDeparmentName = WordUtil.getPinYinHeadChar(mainDeparmentName);
code = code + mainDeparmentName + nowTime + orderNumber;
return code;
} }
// 用于执行线程任务 // 用于执行线程任务
@ -769,81 +965,4 @@ public class GroupServiceImpl implements GroupService {
return stringObjectMap; return stringObjectMap;
} }
} }
/**
* 构造树形组件数据模板
*
* @param g 组合
* @param children 子类
* @return
*/
public Map<String, Object> InitTreeMenus(Group g, List<Object> children) {
if (g != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", g.getGname());
map.put("id", g.getId());
map.put("children", children);
return map;
} else {
return null;
}
}
/**
* 构造树形组件的子组件模板
*
* @param g 组合详细信息
* @return
*/
public Map<String, Object> InitTreeMenus(GroupInfo g) {
if (g != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", g.getMname() + ",数量:" + g.getQuantity());
map.put("id", g.getId());
return map;
} else {
return null;
}
}
/**
* 用于创建组合编码
*
* @param num 第几个组合
* @return
*/
public String createCode(Integer num) {
String code = String.format("%04d", num + 1);
return code;
}
/**
* 生成出库单号
*
* @return
*/
private String createOutCode(String key, String mainDeparmentName) {
RLock lock = redissonClient.getLock(key);
// 入库单号(公司简称+仓库简称+年月日+数字(位数设置>=9))
String code = "GK";
String nowTime = DateUtil.getNowTime();
lock.lock(5, TimeUnit.SECONDS);
String orderNumber = redisTemplate.opsForValue().get(key);
if (orderNumber == null) {
redisTemplate.opsForValue().set(key, "1", DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS);
orderNumber = "1";
}
int newNumber = ObjectFormatUtil.toInteger(orderNumber) + 1;
redisTemplate.boundValueOps(key).set(String.valueOf(newNumber), DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS);
lock.unlock();
orderNumber = String.format("%09d", ObjectFormatUtil.toInteger(orderNumber));
mainDeparmentName = WordUtil.getPinYinHeadChar(mainDeparmentName);
code = code + mainDeparmentName + nowTime + orderNumber;
return code;
}
} }

49
src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java

@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.*; import com.dreamchaser.depository_manage.mapper.*;
import com.dreamchaser.depository_manage.pojo.InventoryP; import com.dreamchaser.depository_manage.pojo.InventoryP;
import com.dreamchaser.depository_manage.pojo.MaterialAndPlaceForView;
import com.dreamchaser.depository_manage.pojo.MaterialP; import com.dreamchaser.depository_manage.pojo.MaterialP;
import com.dreamchaser.depository_manage.pojo.PlaceP; import com.dreamchaser.depository_manage.pojo.PlaceP;
import com.dreamchaser.depository_manage.service.*; import com.dreamchaser.depository_manage.service.*;
@ -434,21 +435,25 @@ public class MaterialServiceImpl implements MaterialService {
} }
/** /**
* 根据物料id获取其在对应仓库中的库存数 * 根据套餐详情获取其在对应仓库中的库存数
* *
* @param mid 物料id * @param groupInfo 套餐详情
* @param depositoryList 待查询的仓库 * @param depositoryList 待查询的仓库
* @return * @return
*/ */
@Override @Override
public List<Integer> findInventoryByMidAndDepository(Integer mid, List<Depository> depositoryList) { public List<Integer> findInventoryByMidAndDepository(GroupInfo groupInfo, List<Depository> depositoryList) {
// 用于存储各仓库的库存 // 用于存储各仓库的库存
List<Integer> result = new ArrayList<>(); List<Integer> result = new ArrayList<>();
// // 获取当前物料在组合中的单位
String unit = groupInfo.getUnit();
// 定义参数列表
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("mid", mid); map.put("mid", groupInfo.getMid());
for (int i = 0; i < depositoryList.size(); i++) { if("-1".equals(unit)) {
Depository depository = depositoryList.get(i); // 如果是基础单位
for (Depository depository : depositoryList) {
map.put("did", depository.getId()); map.put("did", depository.getId());
Inventory inventory = materialMapper.findInventoryByMidAndDid(map); Inventory inventory = materialMapper.findInventoryByMidAndDid(map);
if (inventory != null) { if (inventory != null) {
@ -457,6 +462,36 @@ public class MaterialServiceImpl implements MaterialService {
result.add(0); result.add(0);
} }
} }
}else{
// 如果不是基础单位
map.put("newUnit",unit);
// 获取当前拆单单位
SplitInfo splitInfo = splitUnitMapper.findSplitInfoByMidAndUnit(map);
// 获取当前拆单单位与基础单位的进制
int scale = splitUnitService.findSplitInfoScaleQuantity(splitInfo,-1);
// 用户获取对应拆单库存记录
Map<String,Object> paramForSplitInventory = new HashMap<>();
paramForSplitInventory.put("sid",splitInfo.getId());
for (Depository depository : depositoryList) {
Integer quantity = 0;
// 获取该物料在该仓库下的映射关系
List<MaterialAndPlaceForView> placeAndMaterialByDidAndMid = placeService.findPlaceAndMaterialByDidAndMid(depository.getId(), groupInfo.getMid());
for (MaterialAndPlaceForView materialAndPlaceForView : placeAndMaterialByDidAndMid) {
paramForSplitInventory.put("iid", materialAndPlaceForView.getId());
MaterialAndPlace materialAndPlace = new MaterialAndPlace();
materialAndPlace.setQuantity(materialAndPlaceForView.getInventory());
materialAndPlace.setId(materialAndPlaceForView.getId());
quantity += splitUnitService.findAllInventoryForSplitInfo(-1, materialAndPlace, splitInfo.getId(), 0, true);
}
result.add(quantity);
}
}
return result; return result;
} }

15
src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java

@ -6,6 +6,7 @@ import com.dreamchaser.depository_manage.entity.PidOrDidAndCode;
import com.dreamchaser.depository_manage.entity.Place; import com.dreamchaser.depository_manage.entity.Place;
import com.dreamchaser.depository_manage.mapper.PlaceMapper; import com.dreamchaser.depository_manage.mapper.PlaceMapper;
import com.dreamchaser.depository_manage.mapper.QrCodeMapper; import com.dreamchaser.depository_manage.mapper.QrCodeMapper;
import com.dreamchaser.depository_manage.pojo.MaterialAndPlaceForView;
import com.dreamchaser.depository_manage.pojo.PlaceP; import com.dreamchaser.depository_manage.pojo.PlaceP;
import com.dreamchaser.depository_manage.service.DepositoryService; import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.service.PlaceService; import com.dreamchaser.depository_manage.service.PlaceService;
@ -224,6 +225,20 @@ public class PlaceServiceImpl implements PlaceService {
return placeMapper.findPlaceAndMaterialByPid(id); return placeMapper.findPlaceAndMaterialByPid(id);
} }
/**
* 根据仓库id及物料id获取对应库位存储的物料
* @param did 待查询仓库id
* @param mid 物料id
* @return
*/
@Override
public List<MaterialAndPlaceForView> findPlaceAndMaterialByDidAndMid(Integer did, Integer mid) {
Map<String,Object> map = new HashMap<>();
map.put("depositoryId",did);
map.put("mid",mid);
return placeMapper.findPlaceAndMaterialByDidAndMid(map);
}
/** /**
* 根据当前库位编号及物料编号获取具体库位 * 根据当前库位编号及物料编号获取具体库位
*/ */

3
src/main/java/com/dreamchaser/depository_manage/service/impl/SplitUnitServiceImpl.java

@ -415,7 +415,8 @@ public class SplitUnitServiceImpl implements SplitUnitService {
} }
} else { }
else {
// 如果不是获取所有库存 // 如果不是获取所有库存
// 获取当前基础单位 // 获取当前基础单位
SplitInfo baseSplitInfo = splitUnitMapper.findSplitInfoById(baseSplitInfoId); SplitInfo baseSplitInfo = splitUnitMapper.findSplitInfoById(baseSplitInfoId);

2
src/main/resources/templates/pages/application/application-out.html

@ -686,7 +686,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">计量单位:</label> <label class="layui-form-label">计量单位:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请填写入物料计量单位" value="${obj.unit === null ? '' : obj.unit}" <input type="text" placeholder="请填写入物料计量单位" value="${obj.showUnit === null ? '' : obj.showUnit}"
readonly readonly
class="layui-input" lay-verify="text" required> class="layui-input" lay-verify="text" required>
</div> </div>

2
src/main/resources/templates/pages/group/applicationOutForGroup.html

@ -298,7 +298,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">计量单位:</label> <label class="layui-form-label">计量单位:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请填写入物料计量单位" value="${obj.unit === null ? '' : obj.unit}" <input type="text" placeholder="请填写入物料计量单位" value="${obj.showUnit === null ? '' : obj.showUnit}"
readonly readonly
class="layui-input" lay-verify="text" required> class="layui-input" lay-verify="text" required>
</div> </div>

5
src/test/java/com/dreamchaser/depository_manage/TestForOther.java

@ -36,8 +36,9 @@ public class TestForOther {
@Test @Test
public void Test() throws IOException { public void Test() throws IOException {
SplitInfo splitInfoById = splitUnitMapper.findSplitInfoById(1);
int splitInfoScaleQuantity = findSplitInfoScaleQuantity(splitInfoById, -1);
System.out.println(splitInfoScaleQuantity);
} }
/** /**

43
target/classes/com/dreamchaser/depository_manage/mapper/PlaceMapper.xml

@ -30,6 +30,27 @@
<result column="code" property="code" jdbcType="VARCHAR" /> <result column="code" property="code" jdbcType="VARCHAR" />
</resultMap> </resultMap>
<resultMap id="MaterialAndPlaceForViewMap" type="com.dreamchaser.depository_manage.pojo.MaterialAndPlaceForView">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="mid" property="mid" jdbcType="INTEGER" />
<result column="pid" property="pid" jdbcType="INTEGER" />
<result column="type_id" property="type_id" jdbcType="INTEGER" />
<result column="iid" property="iid" jdbcType="INTEGER" />
<result column="depository_id" property="depository_id" jdbcType="INTEGER" />
<result column="inventory" property="inventory" jdbcType="INTEGER" />
<result column="price" property="price" jdbcType="INTEGER" />
<result column="dcode" property="dcode" jdbcType="VARCHAR" />
<result column="dname" property="dname" jdbcType="VARCHAR" />
<result column="pcode" property="pcode" jdbcType="VARCHAR" />
<result column="texture" property="texture" jdbcType="VARCHAR" />
<result column="unit" property="unit" jdbcType="VARCHAR" />
<result column="version" property="version" jdbcType="VARCHAR" />
<result column="mcode" property="mcode" jdbcType="VARCHAR" />
<result column="tname" property="tname" jdbcType="VARCHAR" />
<result column="mname" property="mname" jdbcType="VARCHAR" />
<result column="adminorg" property="adminorg" jdbcType="VARCHAR" />
</resultMap>
<!-- 表查询字段 --> <!-- 表查询字段 -->
<sql id="allColumns"> <sql id="allColumns">
p.id,p.x,p.y,p.z,p.code,p.mid,p.did,p.min,p.max,p.state,p.quantity p.id,p.x,p.y,p.z,p.code,p.mid,p.did,p.min,p.max,p.state,p.quantity
@ -39,6 +60,10 @@
mp.id,mp.mid,mp.pid,mp.quantity,p.code,p.max,p.min,p.did mp.id,mp.mid,mp.pid,mp.quantity,p.code,p.max,p.min,p.did
</sql> </sql>
<sql id="allColumnsForView">
depository_id,mname,type_id,tname,mcode,version,price,unit,texture,pcode,dname,adminorg,dcode,iid,inventory,id,pid,mid
</sql>
<!-- 查询所有 --> <!-- 查询所有 -->
<select id="findPlaceAll" resultMap="placeMap"> <select id="findPlaceAll" resultMap="placeMap">
@ -74,6 +99,18 @@
</if> </if>
</select> </select>
<select id="findPlaceAndMaterialByDidAndMid" resultMap="MaterialAndPlaceForViewMap" parameterType="map">
select
<include refid="allColumnsForView"/>
FROM materialandplaceinfo WHERE 1 = 1
<if test="mid != '' and mid != null">
and mid = #{mid}
</if>
<if test="depositoryId != null and depositoryId != ''">
and depository_id = #{depositoryId}
</if>
</select>
<!-- 根据条件参数查询列表 --> <!-- 根据条件参数查询列表 -->
<select id="findPlaceByCondition" resultMap="placeMap" parameterType="map"> <select id="findPlaceByCondition" resultMap="placeMap" parameterType="map">
SELECT SELECT
@ -184,6 +221,12 @@
FROM materialandplace mp left join place p on p.id = mp.pid WHERE 1 = 1 and p.id = #{id} FROM materialandplace mp left join place p on p.id = mp.pid WHERE 1 = 1 and p.id = #{id}
</select> </select>
<select id="findPlaceAndMaterialByDidAndMid" resultMap="materialAndPlaceMap" parameterType="int">
SELECT
<include refid="allColumnsByMaterialAndPlace" />
FROM materialandplace mp left join place p on p.id = mp.pid WHERE 1 = 1 and p.id = #{id}
</select>
<select id="findPlaceAndMaterialByMidAndPid" resultMap="materialAndPlaceMap" parameterType="map"> <select id="findPlaceAndMaterialByMidAndPid" resultMap="materialAndPlaceMap" parameterType="map">
SELECT SELECT
<include refid="allColumnsByMaterialAndPlace" /> <include refid="allColumnsByMaterialAndPlace" />

2
target/classes/templates/pages/application/application-out.html

@ -686,7 +686,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">计量单位:</label> <label class="layui-form-label">计量单位:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请填写入物料计量单位" value="${obj.unit === null ? '' : obj.unit}" <input type="text" placeholder="请填写入物料计量单位" value="${obj.showUnit === null ? '' : obj.showUnit}"
readonly readonly
class="layui-input" lay-verify="text" required> class="layui-input" lay-verify="text" required>
</div> </div>

2
target/classes/templates/pages/group/applicationOutForGroup.html

@ -298,7 +298,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">计量单位:</label> <label class="layui-form-label">计量单位:</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="text" placeholder="请填写入物料计量单位" value="${obj.unit === null ? '' : obj.unit}" <input type="text" placeholder="请填写入物料计量单位" value="${obj.showUnit === null ? '' : obj.showUnit}"
readonly readonly
class="layui-input" lay-verify="text" required> class="layui-input" lay-verify="text" required>
</div> </div>

Loading…
Cancel
Save