Browse Source

完成库存盘点功能

lwx_dev
erdanergou 3 years ago
parent
commit
6491ca305c
  1. 4
      src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/MessageByMarkDown.java
  2. 15
      src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java
  3. 17
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java
  4. 103
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java
  5. 191
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  6. 29
      src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java
  7. 217
      src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java
  8. 2
      src/main/java/com/dreamchaser/depository_manage/entity/Material.java
  9. 38
      src/main/java/com/dreamchaser/depository_manage/entity/StockTakingChild.java
  10. 2
      src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java
  11. 2
      src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml
  12. 8
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java
  13. 10
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  14. 176
      src/main/java/com/dreamchaser/depository_manage/mapper/StockTakingMapper.java
  15. 42
      src/main/java/com/dreamchaser/depository_manage/pojo/SimpleStockTakingP.java
  16. 8
      src/main/java/com/dreamchaser/depository_manage/service/CompanyService.java
  17. 108
      src/main/java/com/dreamchaser/depository_manage/service/StockTakingService.java
  18. 208
      src/main/java/com/dreamchaser/depository_manage/service/impl/CompanyServiceImpl.java
  19. 31
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java
  20. 10
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java
  21. 2
      src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java
  22. 47
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  23. 494
      src/main/java/com/dreamchaser/depository_manage/service/impl/QyWxOperationService.java
  24. 867
      src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java
  25. 3
      src/main/resources/templates/pages/application/application-in.html
  26. 44
      src/main/resources/templates/pages/application/my-apply.html
  27. 106
      src/main/resources/templates/pages/application/my-task.html
  28. 2
      src/main/resources/templates/pages/material/material-view.html
  29. 1
      src/main/resources/templates/pages/material/selectMaterialByCardForTaking.html
  30. 350
      src/main/resources/templates/pages/stockTaking/stockTakingReview.html
  31. 291
      src/main/resources/templates/pages/stockTaking/stockTakingView.html
  32. 395
      src/main/resources/templates/pages/stockTaking/stockTransfer.html
  33. 11
      src/test/java/com/dreamchaser/depository_manage/Test.java
  34. 2
      target/classes/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml
  35. 10
      target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  36. 3
      target/classes/templates/pages/application/application-in.html
  37. 44
      target/classes/templates/pages/application/my-apply.html
  38. 106
      target/classes/templates/pages/application/my-task.html
  39. 2
      target/classes/templates/pages/material/material-view.html

4
src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/MessageByMarkDown.java

@ -2,6 +2,10 @@ package com.dreamchaser.depository_manage.config.QyWx_template_card;
import lombok.Data;
/**
* 用于发送markdown消息
*/
@Data
public class MessageByMarkDown extends BaseMessage {
private Object markdown;

15
src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java

@ -78,7 +78,7 @@ public class CompanyController {
AdministrationP administrationP = new AdministrationP(administration);
administrationPList.add(administrationP);
}
return new RestResponse(list,total,200);
return new RestResponse(administrationPList,total,200);
}
/**
@ -317,4 +317,17 @@ public class CompanyController {
return new RestResponse(postPS, postPS.size(), 200);
}
/**
* 用于进行选择负责人
* @param request
* @return
*/
@GetMapping("/treeMenus")
public RestResponse InitTreeMenus(HttpServletRequest request) {
List<Object> list = new ArrayList<>();
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
list = companyService.InitTreeMenus(userToken);
return new RestResponse(list);
}
}

17
src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java

@ -6,19 +6,16 @@ import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.security.bean.UserToken;
import com.dreamchaser.depository_manage.service.*;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService;
import com.dreamchaser.depository_manage.utils.CrudUtil;
import com.dreamchaser.depository_manage.utils.DateUtil;
import com.dreamchaser.depository_manage.utils.HttpUtils;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import netscape.javascript.JSObject;
import org.apache.http.protocol.HTTP;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@ -315,7 +312,7 @@ public class DepositoryRecordController {
integer += depositoryRecordService.insertApplicationOutMin(map);
}
// 向企业微信中对应用户发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -364,7 +361,7 @@ public class DepositoryRecordController {
map.remove("id");
// 插入子订单
integer += depositoryRecordService.insertApplicationOutMin(map);
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -623,7 +620,7 @@ public class DepositoryRecordController {
if(params.size() < 1 && map.size() > 4){
integer += depositoryRecordService.transferApply(map,userToken);
Object id = map.get("parentId");
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -645,7 +642,7 @@ public class DepositoryRecordController {
insert.put("code",map.get("code"+temp));
integer += depositoryRecordService.transferApply(insert,userToken);
Object id = insert.get("parentId");
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -657,7 +654,7 @@ public class DepositoryRecordController {
}
integer += depositoryRecordService.transferApply(map,userToken);
Object id = map.get("parentId");
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -801,7 +798,7 @@ public class DepositoryRecordController {
}
success += depositoryRecordService.insertApplicationOutMin(map);
// 向企业微信中对应用户发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -967,7 +964,7 @@ public class DepositoryRecordController {
}
}
// 向企业微信中对应用户发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));

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

@ -244,6 +244,43 @@ public class MaterialController {
return new RestResponse(map, 1, 200);
}
/**
* 根据物料id与库位id获取物料
*
* @param mid
* @return
*/
@GetMapping("/findMatrialByIdAndPid")
public RestResponse findMatrialByIdAndPid(@RequestParam(value = "mid", required = false) String mid,
@RequestParam(value = "pid", required = false) String pid,
HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
if ("".equals(mid)) {
return new RestResponse("", 0, 200);
}
Map<String, Object> map = new HashMap<>();
Material materialById = materialService.findMaterialById(ObjectFormatUtil.toInteger(mid));
List<PlaceP> placePList = new ArrayList<>();
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString());
for (int i = 0; i < depositoryByAdminorg.size(); i++) {
List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(ObjectFormatUtil.toInteger(mid), depositoryByAdminorg.get(i).getId());
placePList.addAll(placeByMidAndDid);
}
Map<String, Object> param = new HashMap<>();
param.put("code", materialById.getCode());
Map<String, Object> paramByBarcode = new HashMap<>();
paramByBarcode.put("mcode", materialById.getCode());
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(paramByBarcode);
materialById.setMaterialAndBarCodeList(materialByBarCodeByCondition);
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(pid), materialById.getId());
materialById.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
map.put("materialById", materialById);
map.put("placeList", placePList);
return new RestResponse(map, 1, 200);
}
/**
* 根据物料编码获取物料
*
@ -521,6 +558,14 @@ public class MaterialController {
// 如果当前物料不在该库位
flag = false;
}
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
} else {
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, materialP.getId());
if (placeAndMaterialByMidAndPid == null) {
// 如果当前物料不在该库位
flag = false;
}
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
}
mp = materialP;
} else {
@ -716,17 +761,27 @@ public class MaterialController {
if (inventory.size() > 0) {
// 如果存在该物料
MaterialP materialP = inventory.get(0);
Map<String,Object> paramByBarCode = new HashMap<>();
paramByBarCode.put("mcode",materialP.getCode());
Map<String, Object> paramByBarCode = new HashMap<>();
paramByBarCode.put("mcode", materialP.getCode());
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(paramByBarCode);
materialP.setMaterialAndBarCodeList(materialByBarCodeByCondition);
isExist = true;
if(!"0".equals(placeId)) {
if (!"0".equals(placeId)) {
// 如果不是默认库位
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(materialP.getId(), ObjectFormatUtil.toInteger(placeId));
if(placeAndMaterialByMidAndPid == null){
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(placeId), materialP.getId());
if (placeAndMaterialByMidAndPid == null) {
isExist = false;
}else{
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
}
} else {
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, materialP.getId());
if (placeAndMaterialByMidAndPid == null) {
isExist = false;
}else{ mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
}
}
mp = materialP;
@ -763,6 +818,14 @@ public class MaterialController {
// 如果当前物料不在该库位
tempflag = false;
}
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
} else {
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, materialP.getId());
if (placeAndMaterialByMidAndPid == null) {
tempflag = false;
}
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
}
mp = materialP;
} else {
@ -890,34 +953,46 @@ public class MaterialController {
if ("".equals(code)) {
return new RestResponse(null, 1, 200);
}
param.put("code", code);
param.put("mcode", code);
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(param);
List<MaterialP> materialPByCondition = new ArrayList<>();
MaterialP mp = null;
if ("0".equals(placeId)) {
// 如果是默认库位
param.put("depositoryId", depositoryId);
materialPByCondition = materialService.findInventory(param);
} else { // 如果不是默认库位
// 获取当前库位
Place placeById = placeService.findPlaceById(ObjectFormatUtil.toInteger(placeId));
param.put("code", code);
param.put("depositoryId", depositoryId);
materialPByCondition = materialService.findInventory(param);
}
if (materialPByCondition.size() > 0) {
// 如果成功获取
mp = materialPByCondition.get(0);
mp.setMaterialAndBarCodeList(materialByBarCodeByCondition);
if (!"0".equals(placeId)) {
// 如果不是获取默认库位
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(placeId), mp.getId());
if (placeAndMaterialByMidAndPid == null) {
// 如果当前库位没有该物料
mp = null;
}else{
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
}
} else {
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, mp.getId());
if (placeAndMaterialByMidAndPid == null) {
// 如果当前库位没有该物料
mp = null;
}else{
mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity());
}
}
}
return new RestResponse(mp, 1, 200);
}
}

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

@ -78,6 +78,9 @@ public class PageController {
@Autowired
private RedisTemplate<String,String> redisTemplateForHash;
@Autowired
private StockTakingService stockTakingService;
@ -411,6 +414,14 @@ public class PageController {
return mv;
}
// 负责人树形菜单页面
@GetMapping("/selectManager")
public ModelAndView selectManager(){
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/post/selectManager");
return mv;
}
// 专用于卡片物料树形菜单页面
@GetMapping("/selectMaterialByCard")
public ModelAndView selectMaterialByCard(String mname,String type,String clickObj){
@ -1297,6 +1308,117 @@ public class PageController {
return mv;
}
@GetMapping("/StockTakingReview")
public ModelAndView StockTakingReview(Integer id,HttpServletRequest request){
ModelAndView mv = new ModelAndView();
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
mv.setViewName("pages/stockTaking/stockTakingReview");
// 获取盘点记录主表
StockTaking stockTaking = stockTakingService.findStockTakingById(id);
// 获取主表下的所有子表
List<StockTakingChildP> stockTakingChildPByMainId = stockTakingService.findStockTakingChildPByMainId(id);
StockTakingP stp = new StockTakingP(stockTaking);
// 设置发起时间
stp.setCreateTime(DateUtil.TimeStampToDateTime(stockTaking.getCreateTime()));
// 获取申请人
UserByPort userByPort = FindUserById(stockTaking.getOriginator(),userToken);
// 设置盘点发起人姓名
stp.setOriginatorName(userByPort.getName());
// 负责人姓名
StringBuilder managerName = new StringBuilder();
String[] split = stp.getDepartmentManager().split(",");
for (int i = 0; i < split.length; i++) {
String s = split[i];
if("".equals(s)){
continue;
}
UserByPort manager = FindUserById(ObjectFormatUtil.toInteger(s), userToken);
managerName.append(manager.getName()+",");
}
stp.setDepartmentManagerName(managerName.toString());
// 获取盘点位置
Integer placeId = stockTaking.getPlaceId();
StringBuilder location = new StringBuilder();
Depository depository = depositoryService.findDepositoryRecordById(stockTaking.getDepositoryId());
location.append(depository.getDname());
if(!(Integer.compare(placeId,0) == 0)){
// 如果不是默认库位
Place placeById = placeService.findPlaceById(placeId);
location.append("-"+placeById.getCode());
}
// 设置盘点位置
stp.setDepositoryName(location.toString());
mv.addObject("mainRecord",stp);
mv.addObject("recordChild",stockTakingChildPByMainId);
return mv;
}
// 跳转到盘点详情
@GetMapping("/StockTakingView")
public ModelAndView StockTakingView(Integer id,HttpServletRequest request){
ModelAndView mv = new ModelAndView();
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
mv.setViewName("pages/stockTaking/stockTakingView");
// 获取盘点记录主表
StockTaking stockTaking = stockTakingService.findStockTakingById(id);
// 获取主表下的所有子表
List<StockTakingChildP> stockTakingChildPByMainId = stockTakingService.findStockTakingChildPByMainId(id);
StockTakingP stp = new StockTakingP(stockTaking);
// 设置发起时间
stp.setCreateTime(DateUtil.TimeStampToDateTime(stockTaking.getCreateTime()));
stp.setCompleteTime("");
// 获取完成时间
Long completeTime = stockTaking.getCompleteTime();
if(completeTime != null){
// 如果已经完成审核
stp.setCompleteTime(DateUtil.TimeStampToDateTime(completeTime));
}
// 获取申请人
UserByPort userByPort = FindUserById(stockTaking.getOriginator(),userToken);
// 设置盘点发起人姓名
stp.setOriginatorName(userByPort.getName());
// 负责人姓名
StringBuilder managerName = new StringBuilder();
String[] split = stp.getDepartmentManager().split(",");
for (int i = 0; i < split.length; i++) {
String s = split[i];
if("".equals(s)){
continue;
}
UserByPort manager = FindUserById(ObjectFormatUtil.toInteger(s), userToken);
managerName.append(manager.getName()+",");
}
stp.setDepartmentManagerName(managerName.toString());
// 获取盘点位置
Integer placeId = stockTaking.getPlaceId();
StringBuilder location = new StringBuilder();
Depository depository = depositoryService.findDepositoryRecordById(stockTaking.getDepositoryId());
location.append(depository.getDname());
if(!(Integer.compare(placeId,0) == 0)){
// 如果不是默认库位
Place placeById = placeService.findPlaceById(placeId);
location.append("-"+placeById.getCode());
}
// 设置盘点位置
stp.setDepositoryName(location.toString());
mv.addObject("mainRecord",stp);
mv.addObject("recordChild",stockTakingChildPByMainId);
return mv;
}
@GetMapping("/account_look")
public ModelAndView account_look(Integer id, HttpServletRequest request) {
ModelAndView mv = new ModelAndView();
@ -1385,7 +1507,8 @@ public class PageController {
@GetMapping("/company_detail")
public ModelAndView company_detail(Integer id,UserByPort userByPort) {
public ModelAndView company_detail(Integer id,HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
String url = PortConfig.external_url + "/org/getgovcont";
Map<String, Object> map = new HashMap<>();
ModelAndView mv = new ModelAndView();
@ -1798,11 +1921,75 @@ public class PageController {
// 跳转至库存盘点页面
@GetMapping("/stockTaking")
public ModelAndView stockTaking(HttpServletRequest request){
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/material/stockTaking");
// 获取仓储中心详情
Administration company = PageController.getCompany(361, userToken);
// 获取仓储中心负责人
List<UserByPort> departmentHeadByUser = PortConfig.findDepartmentHeadByUser(company, userToken);
StringBuilder departmentHeadName = new StringBuilder();
StringBuilder departmentHeadId = new StringBuilder();
for (int i = 0; i < departmentHeadByUser.size(); i++) {
UserByPort userByPort = departmentHeadByUser.get(i);
departmentHeadName.append(userByPort.getName()).append(",");
departmentHeadId.append(userByPort.getId()).append(",");
}
mv.addObject("departmentHeadName",departmentHeadName.toString());
mv.addObject("departmentHeadId",departmentHeadId.toString());
mv.setViewName("pages/stockTaking/stockTaking");
return mv;
}
// 用于打开盘点后物料转移页面
@GetMapping("/stockTakingTransfer")
public ModelAndView stockTakingTransfer(String minIds,HttpServletRequest request){
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
List<StockTakingChildP> takingChildPS = new ArrayList<>();
StockTaking stockTaking = null;
String[] split = minIds.split(",");
for (int i = 0; i < split.length; i++) {
String minRecordId = split[i];
if("".equals(minRecordId)){
continue;
}
// 获取当前子订单
StockTakingChildP stcp = stockTakingService.findStockTakingChildPById(ObjectFormatUtil.toInteger(minRecordId));
// 获取主订单
stockTaking = stockTakingService.findStockTakingById(stcp.getMainId());
Integer placeId = stockTaking.getPlaceId();
// 获取库位详情
Place placeById = placeService.findPlaceById(placeId);
// 获取当前物料在其库位中的数量
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(placeId, stcp.getMid());
// 获取盘点数量
Integer newInventory = stcp.getNewInventory();
// 获取当前盘点后超出的数量
Integer inventory = newInventory + placeById.getQuantity() - placeById.getMax();
// 将计算后的数量赋值(最少转移量)
stcp.setInventory(inventory);
takingChildPS.add(stcp);
}
mv.addObject("mainRecord",stockTaking);
mv.addObject("recordChild",takingChildPS);
mv.addObject("minIds",minIds);
mv.setViewName("pages/stockTaking/stockTransfer");
return mv;
}
@GetMapping("/scanCodeByTaking")
public ModelAndView scanCodeByTaking(){
ModelAndView mv = new ModelAndView();

29
src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java

@ -7,6 +7,7 @@ import com.dreamchaser.depository_manage.config.QyWxConfig;
import com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes.AesException;
import com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes.WXBizMsgCrypt;
import com.dreamchaser.depository_manage.entity.CallBackLog;
import com.dreamchaser.depository_manage.entity.StockTaking;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackBaseXml;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
@ -15,6 +16,7 @@ import com.dreamchaser.depository_manage.security.pool.UserKeyAndTokenPool;
import com.dreamchaser.depository_manage.service.CallBackLogService;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.service.StockTakingService;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import com.dreamchaser.depository_manage.utils.QyWxXMLUtils;
@ -57,6 +59,10 @@ public class QyWxOperationController {
DepositoryRecordService depositoryRecordService;
@Autowired
StockTakingService stockTakingService;
/**
* 用于接收企业微信的回调get方式
*/
@ -157,20 +163,40 @@ public class QyWxOperationController {
// 获取点击的按钮
String clickKey = templateCard.getEventKey().split("_")[1];
// 获取点击卡片的类型
String templateCardType = templateCard.getEventKey().split("_")[2];
String result = "";
if("pass".equals(clickKey)){
result = "通过";
}else{
result = "驳回";
}
if(templateCardType.contains("StockTaking")){
// 如果点击的是库存盘点审核
// 开启线程处理审批
new Thread(new Runnable() {
@Override
public void run() {
depositoryRecordService.reviewByQyWx(templateCard);
stockTakingService.reviewByQyWx(templateCard);
}
}).start();
}else if(templateCardType.contains("out")){
// 如果点击的是出库审核
// 开启线程处理审批
new Thread(new Runnable() {
@Override
public void run() {
depositoryRecordService.reviewByQyWx(templateCard);
}
}).start();
}
// 开启线程更改其他用户卡片模板样式
String finalResult = result;
new Thread(new Runnable() {
@ -180,7 +206,6 @@ public class QyWxOperationController {
}
}).start();
// 待加密模板
String sRespData = String.format("<xml><ToUserName><![CDATA[%s]]></ToUserName>" +
"<FromUserName><![CDATA[%s]]></FromUserName>" +

217
src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java

@ -0,0 +1,217 @@
package com.dreamchaser.depository_manage.controller;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.entity.Place;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.pojo.RestResponse;
import com.dreamchaser.depository_manage.pojo.SimpleStockTakingP;
import com.dreamchaser.depository_manage.pojo.StatusInfo;
import com.dreamchaser.depository_manage.service.MaterialService;
import com.dreamchaser.depository_manage.service.MaterialTypeService;
import com.dreamchaser.depository_manage.service.PlaceService;
import com.dreamchaser.depository_manage.service.StockTakingService;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService;
import com.dreamchaser.depository_manage.utils.CrudUtil;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* 库存盘点控制器
*/
@RestController
@RequestMapping("/stockTaking")
public class StockTakingController {
@Autowired
MaterialService materialService;
@Autowired
MaterialTypeService materialTypeService;
@Autowired
StockTakingService stockTakingService;
@Autowired
PlaceService placeService;
@Autowired
QyWxOperationService qyWxOperationService;
@Autowired
private RedisTemplate<String,String> redisTemplateForHash;
// 用于添加盘点记录
@PostMapping("/addStockTakingRecord")
public RestResponse addStockTakingRecord(@RequestBody Map<String,Object> map, HttpServletRequest request){
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
List params = (ArrayList) map.get("params");
String departmentManagerId = (String) map.get("departmentManagerId");
// map.put("departmentManager",departmentManagerId);
map.put("departmentManager","6235");
// 用于设置企业微信接收人
StringBuilder QyWxDepartmentManager = new StringBuilder();
/*String[] split = departmentManagerId.split(",");
for (int i = 0; i < split.length; i++) {
String s = split[i];
if("".equals(s)){
continue;
}
UserByPort departmentManager = PageController.FindUserById(ObjectFormatUtil.toInteger(s), userToken);
QyWxDepartmentManager.append(departmentManager.getWorkwechat()+",");
}*/
QyWxDepartmentManager.append("PangFuZhen").append(",");
map.put("state",3);
map.remove("departmentManagerId");
map.put("originator",userToken.getId());
String mcode = (String) map.get("code");
map.remove("code");
Integer success = 0;
if(params.size() > 0){
// 如果有多个表
Map<String,Object> param = new HashMap<>();
param.put("depositoryId",map.get("depositoryId"));
param.put("placeId",map.get("placeId"));
param.put("departmentManager",map.get("departmentManager"));
param.put("state",3);
param.put("originator",userToken.getId());
for (int i = 0; i < params.size(); i++) {
Integer temp = ObjectFormatUtil.toInteger(params.get(i));
map.remove("code");
param.put("mid",map.get("mid"+temp));
param.put("barCode",map.get("barCode"+temp));
param.put("oldInventory",map.get("oldInventory"+temp));
param.put("newInventory",map.get("newInventory"+temp));
param.put("takingResult",map.get("takingResult"+temp));
param.put("inventory",map.get("inventory"+temp));
success += stockTakingService.insertStockTaking(param);
param.remove("id");
}
param.put("mid",map.get("mid"));
param.put("barCode",map.get("barCode"));
param.put("oldInventory",map.get("oldInventory"));
param.put("newInventory",map.get("newInventory"));
param.put("takingResult",map.get("takingResult"));
param.put("inventory",map.get("inventory"));
success += stockTakingService.insertStockTaking(param);
Object mainId = param.get("mainId");
// 向企业微信发送消息
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId));
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
// key user:300450:QyWxOut:1
// 申请人number
redisTemplateForHash.opsForHash().putAll("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,QyWxMessageMap);
// 设置过期时间为三天
redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,72, TimeUnit.HOURS);
}
else{
// 如果只有一个表
success += stockTakingService.insertStockTaking(map);
// 向企业微信发送消息
Object mainId = map.get("mainId");
JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId));
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
QyWxMessageMap.put("responseCode",jsonObject.getString("response_code"));
// key user:300450:QyWxOut:1
// 申请人number
redisTemplateForHash.opsForHash().putAll("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,QyWxMessageMap);
// 设置过期时间为三天
redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,72, TimeUnit.HOURS);
}
if(params.size() > 0 ){
return CrudUtil.postHandle(success,params.size() + 1);
}
else{
return CrudUtil.postHandle(success,1);
}
}
// 用于查询需要用户审核的盘点
@GetMapping("/myTask")
public RestResponse myTask(@RequestParam Map<String,Object> map,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
map.put("userId",userToken.getId());
List<SimpleStockTakingP> myTask = stockTakingService.findMyTask(map, request);
return new RestResponse(myTask,stockTakingService.findMyTaskCount(map),200);
}
// 用于审核
@PostMapping("/review")
public RestResponse review(@RequestBody Map<String,Object> map,HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
Map<String, Object> review = stockTakingService.review(map, userToken);
if(review.containsKey("errMsg")){
// 如果有出错情况
return new RestResponse(review,666,new StatusInfo("有错误","发现错误"));
}else {
return CrudUtil.postHandle(1, 1);
}
}
// 用于查询用户提交的盘点
@GetMapping("/myApply")
public RestResponse myApply(@RequestParam Map<String,Object> map,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
map.put("userId",userToken.getId());
List<SimpleStockTakingP> myTask = stockTakingService.findMyApply(map, request);
return new RestResponse(myTask,stockTakingService.findMyApplyCount(map),200);
}
// 用于查询转入位置的容量
@PostMapping("/findInventoryByLocation")
public RestResponse findInventoryByLocation(@RequestBody Map<String,Object> map,HttpServletRequest request) {
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
String depositoryId = (String) map.get("depositoryId");
String placeId = (String) map.get("placeId");
// 获取当前库位
Place placeById = placeService.findPlaceById(ObjectFormatUtil.toInteger(placeId));
// 获取当前库位的容量
Integer inventory = placeById.getMax() - placeById.getQuantity();
return new RestResponse(inventory);
}
// 用于进行盘点库存转移
@PostMapping("/stockTransfer")
public RestResponse stockTransfer(@RequestBody Map<String,Object> map,HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
String minIds = (String) map.get("minIds");
String[] split = minIds.split(",");
List<Integer> minIdList = new ArrayList<>();
for (int i = 0; i < split.length; i++) {
String s = split[i];
if("".equals(s)){
continue;
}
minIdList.add(ObjectFormatUtil.toInteger(s));
}
map.put("minIds",minIdList);
map.put("inventory",map.get("invnetory5"));
map.remove("invnetory5");
Integer transfer = stockTakingService.stockTakingTransfer(map, userToken);
return CrudUtil.postHandle(transfer,minIdList.size());
}
}

2
src/main/java/com/dreamchaser/depository_manage/entity/Material.java

@ -31,7 +31,7 @@ public class Material {
private Double amounts;
/** 物料种类id */
private Long typeId;
private Long materialTypeId;
/** 物料状态 */
private Integer state;

38
src/main/java/com/dreamchaser/depository_manage/entity/StockTakingChild.java

@ -0,0 +1,38 @@
package com.dreamchaser.depository_manage.entity;
import lombok.Data;
/**
* 盘点子类
*/
@Data
public class StockTakingChild {
/**
* id
*/
private Integer id;
/**
* 物料id
*/
private Integer mid;
/**
* 库存容量
*/
private Integer oldInventory;
/**
* 盘点数量
*/
private Integer newInventory;
/**
* 盘点结果
*/
private String takingResult;
/**
* 盈亏数量
*/
private Integer inventory;
/**
* 主表id
*/
private Long mainId;
}

2
src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java

@ -70,7 +70,7 @@ public interface DepositoryMapper {
* @param id 参数id
* @return 对应仓库信息
*/
Depository findDepositoryRecordById(Integer id);
Depository findDepositoryById(Integer id);
/**
* 根据条件修改数据信息

2
src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml

@ -170,7 +170,7 @@
<!-- 根据主键查询数据-->
<select id="findDepositoryRecordById" resultMap="depositoryMap" parameterType="Integer">
<select id="findDepositoryById" resultMap="depositoryMap" parameterType="Integer">
SELECT
<include refid="allColumns" />
FROM depository d WHERE d.id = #{id}

8
src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java

@ -24,6 +24,14 @@ public interface MaterialMapper {
* @return 受影响的行数
*/
Integer insertMaterial(Map<String, Object> map);
/**
* 增加一条库存记录
*
* @param material
* @return 受影响的行数
*/
Integer insertMaterial(Material material);
/**
* 增加库存记录
*

10
src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml

@ -11,7 +11,7 @@
<result column="mname" property="mname" jdbcType="VARCHAR" />
<result column="quantity" property="quantity" jdbcType="VARCHAR" />
<result column="price" property="price" jdbcType="DOUBLE" />
<result column="type_id" property="typeId" jdbcType="INTEGER" />
<result column="type_id" property="materialTypeId" jdbcType="INTEGER" />
<result column="state" property="state" jdbcType="INTEGER" />
<result column="code" property="code" jdbcType="VARCHAR"/>
<result column="version" property="version" jdbcType="VARCHAR"/>
@ -28,7 +28,7 @@
<result column="mname" property="mname" jdbcType="VARCHAR" />
<result column="quantity" property="quantity" jdbcType="VARCHAR" />
<result column="price" property="price" jdbcType="VARCHAR" />
<result column="type_id" property="typeId" jdbcType="INTEGER" />
<result column="type_id" property="materialTypeId" jdbcType="INTEGER" />
<result column="state" property="state" jdbcType="VARCHAR" />
<result column="code" property="code" jdbcType="VARCHAR"/>
<result column="version" property="version" jdbcType="VARCHAR"/>
@ -345,7 +345,7 @@
<!-- 插入数据 -->
<insert id="insertMaterial" parameterType="map" useGeneratedKeys="true" keyProperty="id">
<insert id="insertMaterial" useGeneratedKeys="true" keyProperty="id">
INSERT INTO material (
id, depository_id, mname, quantity, price, type_id,code,unit,version,texture,amounts,depositoryCode
) VALUES (
@ -467,8 +467,8 @@
<if test="price != null">
price = #{price},
</if>
<if test="typeId != null">
type_id = #{typeId},
<if test="materialTypeId != null">
type_id = #{materialTypeId},
</if>
<if test="state != null and state != ''">
state = #{state},

176
src/main/java/com/dreamchaser/depository_manage/mapper/StockTakingMapper.java

@ -0,0 +1,176 @@
package com.dreamchaser.depository_manage.mapper;
import com.dreamchaser.depository_manage.entity.StockTaking;
import com.dreamchaser.depository_manage.entity.StockTakingChild;
import com.dreamchaser.depository_manage.pojo.StockTakingChildP;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
@Mapper
public interface StockTakingMapper {
/**
* 用于插入盘点记录主表
* @param map
* @return
*/
Integer insertStockTaking(Map<String,Object> map);
/**
* 用于插入盘点记录主表
* @param st
* @return
*/
Integer insertStockTaking(StockTaking st);
/**
* 用于插入盘点记录子表
* @param map
* @return
*/
Integer insertStockTakingChild(Map<String,Object> map);
/**
* 用于插入盘点记录子表
* @param stc
* @return
*/
Integer insertStockTakingChild(StockTakingChild stc);
/**
* 根据主键id删除子表
* @param id
* @return
*/
Integer deleteStockTakingChild(Integer id);
/**
* 根据主键id批量删除子表
* @param list
* @return
*/
Integer deleteStockTakingChilds(List<Integer> list);
/**
* 根据主键删除主表
* @param id
* @return
*/
Integer deleteStockTaking(Integer id);
/**
* 根据主键批量删除主表
* @param list
* @return
*/
Integer deleteStockTakings(List<Integer> list);
/**
* 修改主表记录
* @param map
* @return
*/
Integer updateStockTaking(Map<String,Object> map);
/**
* 修改主表记录
* @param st
* @return
*/
Integer updateStockTaking(StockTaking st);
/**
* 修改子表记录
* @param map
* @return
*/
Integer updateStockTakingChild(Map<String,Object> map);
/**
* 修改子表记录
* @param stc
* @return
*/
Integer updateStockTakingChild(StockTakingChild stc);
/**
* 根据主表id查询所有子表
* @param mainId
* @return
*/
List<StockTakingChildP> selectStockTakingChildByMainId(Integer mainId);
/**
* 根据条件查询主表
* @param map
* @return
*/
List<StockTaking> selectStockTakingByCondition(Map<String,Object> map);
/**
* 根据条件查询盘点详情
* @param map
* @return
*/
List<StockTakingChildP> selectStockTakingChildPByCondition(Map<String,Object> map);
/**
* 根据主键查找主表
* @param id
* @return
*/
StockTaking selectStockTakingById(Integer id);
/**
* 根据主键查找主表
* @param id
* @return
*/
StockTaking selectStockTakingById(Long id);
/**
* 根据主键查找盘点详情
* @param id
* @return
*/
StockTakingChildP selectStockTakingChildPById(Integer id);
/**
* 查询用户的任务
* @param map
* @return
*/
List<StockTaking> findMyTask(Map<String,Object> map);
/**
* 查询用户的任务数量
* @param map
* @return
*/
Integer findMyTaskCount(Map<String,Object> map);
/**
* 查询用户的申请
* @param map
* @return
*/
List<StockTaking> findMyApply(Map<String,Object> map);
/**
* 查询用户的申请数量
* @param map
* @return
*/
Integer findMyApplyCount(Map<String,Object> map);
}

42
src/main/java/com/dreamchaser/depository_manage/pojo/SimpleStockTakingP.java

@ -0,0 +1,42 @@
package com.dreamchaser.depository_manage.pojo;
import com.dreamchaser.depository_manage.entity.StockTaking;
import com.dreamchaser.depository_manage.utils.DateUtil;
import lombok.Data;
/**
* 用于简化输出
*/
@Data
public class SimpleStockTakingP {
/**
* id
*/
private Long id;
/**
* 盘点单号
*/
private String code;
/**
* 仓库名称
*/
private String depositoryName;
/*
发起人姓名
*/
private String originatorName;
/**
* 申请时间
*/
private String createTime;
public SimpleStockTakingP(StockTaking st) {
this.id = st.getId();
this.code = st.getCode();
this.createTime = DateUtil.TimeStampToDateTime(st.getCreateTime());
}
}

8
src/main/java/com/dreamchaser/depository_manage/service/CompanyService.java

@ -1,6 +1,7 @@
package com.dreamchaser.depository_manage.service;
import com.dreamchaser.depository_manage.entity.Company;
import com.dreamchaser.depository_manage.entity.UserByPort;
import java.util.List;
import java.util.Map;
@ -85,4 +86,11 @@ public interface CompanyService {
* @return
*/
Integer updateStateByParam(Map<String,Object> map);
/**
* 用于构造部门负责人树
* @return
*/
List<Object> InitTreeMenus(UserByPort userToken);
}

108
src/main/java/com/dreamchaser/depository_manage/service/StockTakingService.java

@ -0,0 +1,108 @@
package com.dreamchaser.depository_manage.service;
import com.dreamchaser.depository_manage.entity.StockTaking;
import com.dreamchaser.depository_manage.entity.StockTakingChild;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.pojo.SimpleApplicationOutRecordP;
import com.dreamchaser.depository_manage.pojo.SimpleStockTakingP;
import com.dreamchaser.depository_manage.pojo.StockTakingChildP;
import com.dreamchaser.depository_manage.pojo.StockTakingP;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
public interface StockTakingService {
/**
* 用于插入盘点记录主表
* @param map
* @return
*/
Integer insertStockTaking(Map<String,Object> map);
/**
* 用于插入盘点记录主表
* @param st
* @return
*/
Integer insertStockTaking(StockTaking st);
/**
* 根据条件查询自己的任务根据isDone来决定查询已完成或者未完成的任务同时支持分页查询需要begin和size参数
* @param map 查询参数
* @return 我的任务
*/
List<SimpleStockTakingP> findMyTask(Map<String, Object> map, HttpServletRequest request);
/**
* 查询用户的任务数量
* @param map
* @return
*/
Integer findMyTaskCount(Map<String,Object> map);
/**
* 根据条件查询自己的申请
* @param map 查询参数
* @return 我的任务
*/
List<SimpleStockTakingP> findMyApply(Map<String, Object> map, HttpServletRequest request);
/**
* 查询用户的申请数量
* @param map
* @return
*/
Integer findMyApplyCount(Map<String,Object> map);
/**
* 根据主键查询主表
* @param id
* @return
*/
StockTaking findStockTakingById(Integer id);
/**
* 根据主键查询主表
* @param id
* @return
*/
StockTaking findStockTakingById(Long id);
/**
* 根据主表获取所有子表
* @param mainId
* @return
*/
List<StockTakingChildP> findStockTakingChildPByMainId(Integer mainId);
/**
* 根据主键获取子表
* @param id
* @return
*/
StockTakingChildP findStockTakingChildPById(Integer id);
/**
* 用于对盘点进行审核
* @param map
* @return
*/
Map<String,Object> review(Map<String,Object> map, UserByPort userToken);
/**
* 用于进行盘点结果转移
* @param map
* @return
*/
Integer stockTakingTransfer(Map<String,Object> map,UserByPort userToken);
/**
* 用于企业微信的审核申请处理
* @param templateCard
* @return
*/
Integer reviewByQyWx(TemplateCard templateCard);
}

208
src/main/java/com/dreamchaser/depository_manage/service/impl/CompanyServiceImpl.java

@ -1,13 +1,27 @@
package com.dreamchaser.depository_manage.service.impl;
import com.dreamchaser.depository_manage.entity.Company;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.CompanyMapper;
import com.dreamchaser.depository_manage.pojo.AdministrationP;
import com.dreamchaser.depository_manage.pojo.PostP;
import com.dreamchaser.depository_manage.pojo.RoleAndDepository;
import com.dreamchaser.depository_manage.service.CompanyService;
import com.dreamchaser.depository_manage.utils.HttpUtils;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import org.apache.http.protocol.HTTP;
import org.apache.xmlbeans.impl.xb.xsdschema.Public;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
@Service
public class CompanyServiceImpl implements CompanyService {
@ -130,4 +144,196 @@ public class CompanyServiceImpl implements CompanyService {
public Integer updateStateByParam(Map<String, Object> map) {
return companyMapper.updateStateByParam(map);
}
/**
* 用于构造部门负责人树
* @return
*/
@Override
public List<Object> InitTreeMenus(UserByPort userToken) {
// 获取当前用户登录的公司
Map<String,Object> map = new HashMap<>();
map.put("superior",userToken.getCompany().toString());
List<AdministrationP> objectList = FindallCompanyByParent(map,userToken);
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(objectList.size());
// 结果集
List<Object> list = new ArrayList<>();
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < objectList.size(); i++) {
AdministrationP o = objectList.get(i);
Future<Object> future = completionService.submit(new Task(o,userToken));
futureList.add(future);
}
// 3.获取结果
for(int i=0;i<objectList.size();i++){
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.add(result);
}
return list;
}
// 构造树形组件数据模板
public Map<String,Object> InitTreeMenus(AdministrationP ap, List<Object> children){
if(ap != null) {
Map<String, Object> map = new HashMap<>();
map.put("title",ap.getName());
map.put("id", ap.getId());
map.put("children",children);
return map;
}
else{
return null;
}
}
// 根据id获取子类
public List<Object> findChildForMaterialTypeByParent(AdministrationP ap,UserByPort userByPort){
Map<String,Object> param = new HashMap<>();
List<Object> result = new ArrayList<>();
Map<String,Object> children = new HashMap<>();
param.put("superior",ap.getId().toString());
// 获取当前父类的子类
List<AdministrationP> administrationPList = FindallCompanyByParent(param, userByPort);
if(administrationPList.size() > 0){
// 如果还有部门
for (int i = 0; i < administrationPList.size(); i++) {
AdministrationP administrationP = administrationPList.get(i);
List<Object> childForMaterialTypeByParent = findChildForMaterialTypeByParent(administrationP,userByPort);
if(childForMaterialTypeByParent != null && administrationP.getLevel() != 4) {
// 如果子类不为空
result.add(InitTreeMenus(administrationP, childForMaterialTypeByParent));
}else{
// 为当前部门添加部门负责人
List<Object> objectList = addDepartMentHead(administrationP, userByPort);
result.add(InitTreeMenus(administrationP,objectList));
}
}
return result;
}else{
return null;
}
}
// 用于执行线程任务
class Task implements Callable<Object> {
AdministrationP ap;
UserByPort userByPort;
public Task(AdministrationP ap,UserByPort userByPort){
this.ap = ap;
this.userByPort = userByPort;
}
@Override
public Object call() throws Exception {
List<Object> childForMaterialTypeByParent = findChildForMaterialTypeByParent(ap,userByPort);
Map<String, Object> stringObjectMap = InitTreeMenus(ap,childForMaterialTypeByParent);
return stringObjectMap;
}
}
/**
* 用于给当前部门添加部门负责人
* @param ap
* @return
*/
public List<Object> addDepartMentHead(AdministrationP ap,UserByPort userToken){
// 获取当前部门的部门负责人
Map<String,Object> map = new HashMap<>();
map.put("adminorg",ap.getId());
List<UserByPort> departmentHeadByUser = findDepartmentHeadByUser(map, userToken);
List<Object> result = new ArrayList<>();
for (int i = 0; i < departmentHeadByUser.size(); i++) {
UserByPort user = departmentHeadByUser.get(i);
Map<String, Object> children = new HashMap<>();
children.put("title",user.getName());
children.put("id",user.getId());
result.add(children);
}
return result;
}
/**
* 用于获取当前行政组织的子类
* @param map
* @param userToken
* @return
*/
public List<AdministrationP> FindallCompanyByParent(Map<String,Object> map, UserByPort userToken){
String url = PortConfig.external_url +"/org/govlist";
String superior = (String) map.get("superior");
if(superior == null || "".equals(superior)){
superior = "313";
}
map.put("superior",superior);
map.put("state",1);
String jsonString = JSONObject.toJSONString(map);
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
post = HttpUtils.send(url,paramObject, HTTP.UTF_8,userToken);
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(post);
JSONObject data = (JSONObject) jsonObject.get("data");
JSONArray list = (JSONArray) data.get("list");
if(list == null){
list = new JSONArray();
}
List<AdministrationP> administrationPList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Administration administration = JSONObject.toJavaObject((JSONObject)list.get(i), Administration.class);
AdministrationP administrationP = new AdministrationP(administration);
administrationPList.add(administrationP);
}
return administrationPList;
}
/**
* 用于获取当前部门的负责人
* @param map
* @param userToken
* @return
*/
public List<UserByPort> findDepartmentHeadByUser(Map<String,Object> map,UserByPort userToken){
String url = PortConfig.external_url + "/staff/archiveslist";
String jsonString = JSONObject.toJSONString(map);
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
post = HttpUtils.send(url, paramObject, HTTP.UTF_8,userToken);
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(post);
JSONObject data = (JSONObject) jsonObject.get("data");
JSONArray list = (JSONArray) data.get("list");
if(list == null){
list = new JSONArray();
}
List<UserByPort> DepartmentHeads = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
UserByPort userByPort = JSONObject.toJavaObject((JSONObject) list.get(i), UserByPort.class);
if(userByPort.getPersonincharge() == 1){
DepartmentHeads.add(userByPort);
}
}
return DepartmentHeads;
}
}

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

@ -1,11 +1,6 @@
package com.dreamchaser.depository_manage.service.impl;
import cn.hutool.core.util.IdUtil;
import cn.hutool.db.Page;
import cn.hutool.log.Log;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.api.R;
import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.controller.PageController;
import com.dreamchaser.depository_manage.entity.*;
@ -13,24 +8,15 @@ import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.mapper.*;
import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.security.bean.UserToken;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.MaterialTypeService;
import com.dreamchaser.depository_manage.service.RoleService;
import com.dreamchaser.depository_manage.utils.*;
import org.apache.http.protocol.HTTP;
import org.apache.poi.ss.formula.functions.T;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.Mergeable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.hutool.core.lang.Snowflake;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@ -38,7 +24,6 @@ import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author Dreamchaser
@ -103,7 +88,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
@Override
public Integer applicationIn(Map<String, Object> map) {
Integer depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId"));
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId);
Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId);
Map<String, Object> temp = new HashMap<>();
temp.put("dname", depositoryRecordById.getDname());
temp.put("dcode", depositoryRecordById.getCode());
@ -148,7 +133,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
insert.put("price", avgPrice);
insert.put("mname", materialById.getMname());
insert.put("quantity", quantity);
insert.put("materialTypeId", materialById.getTypeId());
insert.put("materialTypeId", materialById.getMaterialTypeId());
insert.put("code", materialById.getCode());
insert.put("unit", materialById.getUnit());
insert.put("version", materialById.getVersion());
@ -197,7 +182,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
}
update.put("numberOfTemporary", numberOfTemporary + quantity);
materialMapper.updateMaterial(update);
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(materialById.getDepositoryId());
Depository depositoryRecordById = depositoryMapper.findDepositoryById(materialById.getDepositoryId());
dname = depositoryRecordById.getDname();
}
@ -566,7 +551,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
}
// 获取出库仓库信息
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(applicationOutMinById.getDepositoryId());
Depository depositoryRecordById = depositoryMapper.findDepositoryById(applicationOutMinById.getDepositoryId());
// 设置子订单新编码
// 获取主订单单号
StringBuilder code = new StringBuilder(record.getCode());
@ -687,7 +672,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.remove("id");
map.put("transferId", transferId);
// 获取当前转移物料仓库
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(material.getDepositoryId());
Depository depositoryRecordById = depositoryMapper.findDepositoryById(material.getDepositoryId());
Administration company = PageController.getCompany(userByPort.getMaindeparment(), userByPort);
// 生成出库订单
map.put("code", createCode(depositoryRecordById.getDname(), "outOrderNumber", "out", company.getName()));
@ -742,7 +727,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
new Thread(new Runnable() {
@Override
public void run() {
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(id), false);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(id), false);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -921,7 +906,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
QyWxUid.append("PangFuZhen"+",");
map.put("depositoryManager", depositoryManager.toString());
// 向仓储中心负责人发送新的消息
JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(outId), false);
JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(outId), false);
// 将当前返回结果保存到redis中
Map<String,Object> QyWxMessageMap = new HashMap<>();
QyWxMessageMap.put("MsgId",jsonObject.getString("msgid"));
@ -1049,7 +1034,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
insert.put("price", materialById.getPrice());
insert.put("mname", materialById.getMname());
insert.put("quantity", quantity);
insert.put("materialTypeId", materialById.getTypeId());
insert.put("materialTypeId", materialById.getMaterialTypeId());
insert.put("code", materialById.getCode());
insert.put("unit", materialById.getUnit());
insert.put("version", materialById.getVersion());

10
src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java

@ -1,6 +1,5 @@
package com.dreamchaser.depository_manage.service.impl;
import cn.hutool.db.Page;
import com.dreamchaser.depository_manage.controller.PageController;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.DepositoryMapper;
@ -12,7 +11,6 @@ import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import com.dreamchaser.depository_manage.utils.WordUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.ArrayUtils;
import java.util.ArrayList;
import java.util.HashMap;
@ -83,7 +81,7 @@ public class DepositoryServiceImpl implements DepositoryService {
map.remove("depositoryId");
// 获取当前仓库父仓库
Integer parentId = ObjectFormatUtil.toInteger(map.get("parentId"));
Depository depositoryId = depositoryMapper.findDepositoryRecordById(parentId);
Depository depositoryId = depositoryMapper.findDepositoryById(parentId);
// 获取当前选择部门
String adminorgName = "";
// 部门编号
@ -186,7 +184,7 @@ public class DepositoryServiceImpl implements DepositoryService {
*/
@Override
public Depository findDepositoryRecordById(Integer id) {
return depositoryMapper.findDepositoryRecordById(id);
return depositoryMapper.findDepositoryById(id);
}
/**
@ -284,7 +282,7 @@ public class DepositoryServiceImpl implements DepositoryService {
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < depositoryListId.size(); i++) {
Integer depositoryId = depositoryListId.get(i);
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId);
Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId);
map.put(depositoryRecordById.getDname() + "," + depositoryRecordById.getCode(), depositoryRecordById.getId());
}
@ -481,7 +479,7 @@ public class DepositoryServiceImpl implements DepositoryService {
for (int i = 0; i < depositoryAndRole.size(); i++) {
RoleAndDepository roleAndDepository = depositoryAndRole.get(i);
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(roleAndDepository.getDepositoryId());
Depository depositoryRecordById = depositoryMapper.findDepositoryById(roleAndDepository.getDepositoryId());
// 如果重复则跳过
if (hasDepository(depositoryList,depositoryRecordById)) {
continue;

2
src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java

@ -282,7 +282,7 @@ public class ExcelServiceImpl implements ExcelService {
Map<String, Object> insert = new HashMap<>();
Integer depositoryId = excelVos.get(i).getDepositoryId();
insert.put("mname", materialByCode.getMname());
insert.put("materialTypeId", materialByCode.getTypeId());
insert.put("materialTypeId", materialByCode.getMaterialTypeId());
insert.put("state", materialByCode.getState());
insert.put("code", materialByCode.getCode());
insert.put("unit", materialByCode.getUnit());

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

@ -1,26 +1,19 @@
package com.dreamchaser.depository_manage.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.DepositoryMapper;
import com.dreamchaser.depository_manage.mapper.MaterialMapper;
import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper;
import com.dreamchaser.depository_manage.pojo.DepositoryRecordP;
import com.dreamchaser.depository_manage.pojo.MaterialP;
import com.dreamchaser.depository_manage.pojo.PlaceP;
import com.dreamchaser.depository_manage.service.MaterialService;
import com.dreamchaser.depository_manage.service.PlaceService;
import com.dreamchaser.depository_manage.service.RoleService;
import com.dreamchaser.depository_manage.utils.HttpUtils;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import com.dreamchaser.depository_manage.utils.TaskCenterUtil;
import org.apache.http.protocol.HTTP;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
@ -108,10 +101,9 @@ public class MaterialServiceImpl implements MaterialService {
}
map.put("price",price);
}
if(map.containsKey("materialTypeId")) {
map.put("typeId", map.get("materialTypeId"));
map.remove("materialTypeId");
}
return materialMapper.updateMaterial(map);
}
@ -159,7 +151,7 @@ public class MaterialServiceImpl implements MaterialService {
}
if(depositoryId != null){
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId);
Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId);
String code = depositoryRecordById.getCode();
list.get(i).setDepositoryCode(code);
}
@ -198,7 +190,7 @@ public class MaterialServiceImpl implements MaterialService {
placeCode.append(placeByMidAndDid.get(j).getCode()).append(" ");
}
if(depositoryId != null){
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId);
Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId);
String code = depositoryRecordById.getCode();
list.get(i).setDepositoryCode(code);
}
@ -251,7 +243,7 @@ public class MaterialServiceImpl implements MaterialService {
@Override
public Material findMaterialById(int id) {
Material material = materialMapper.findMaterialById(id);
MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getTypeId());
MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getMaterialTypeId());
material.setTypeName(materialTypeByOldId.getTname());
material.setPrice(material.getPrice() / 100);
material.setAmounts(material.getAmounts() / 100);
@ -364,7 +356,7 @@ public class MaterialServiceImpl implements MaterialService {
m.setDepositoryName(depositoryMapper.findDepositoryNameById(depositoryId));
m.setWarehouseManager(depositoryMapper.findUserNameByDepositoryId(depositoryId));
}
MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getTypeId());
MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getMaterialTypeId());
m.setTypeName(materialTypeByOldId.getTname());
m.setTypeId(materialTypeByOldId.getOldId());
result.add(m);
@ -392,7 +384,7 @@ public class MaterialServiceImpl implements MaterialService {
map.put("size", size);
}
Integer depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId"));
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId);
Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId);
List<Material> materialByDepository = materialMapper.findMaterialByDepository(map);
for (int i = 0; i < materialByDepository.size(); i++) {
materialByDepository.get(i).setDepositoryCode(depositoryRecordById.getCode());
@ -839,11 +831,20 @@ public class MaterialServiceImpl implements MaterialService {
List<Material> materialPByCondition = new ArrayList<>();
List<Integer> dids = new ArrayList<>();
if("0".equals(placeId)){
// 如果要盘点的位置是默认库位
// 获取当前库位下的所有物料
dids.add(ObjectFormatUtil.toInteger(depositoryId));
param.put("list",dids);
// 获取当前类别下的物料
materialPByCondition = materialMapper.findMaterialByDepositorysAndType(param);
List<Material> materialByDepositorysAndType = materialMapper.findMaterialByDepositorysAndType(param);
for (int i = 0; i < materialByDepositorysAndType.size(); i++) {
Material material = materialByDepositorysAndType.get(i);
Map<String,Object> map = new HashMap<>();
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, material.getId());
if(placeAndMaterialByMidAndPid != null){
materialPByCondition.add(material);
}
}
}else{
// 如果要盘点的位置是某个库位
Integer pid = ObjectFormatUtil.toInteger(placeId);
@ -851,7 +852,15 @@ public class MaterialServiceImpl implements MaterialService {
// 获取当前仓库下的所有物料库存
dids.add(placeById.getDid());
param.put("list",dids);
materialPByCondition = materialMapper.findMaterialByDepositorysAndType(param);
List<Material> materialByDepositorysAndType = materialMapper.findMaterialByDepositorysAndType(param);
for (int i = 0; i < materialByDepositorysAndType.size(); i++) {
Material material = materialByDepositorysAndType.get(i);
Map<String,Object> map = new HashMap<>();
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(pid, material.getId());
if(placeAndMaterialByMidAndPid != null){
materialPByCondition.add(material);
}
}
}
List<Object> result = new ArrayList<>();
if("".equals(mname)) { // 如果没有输入名称

494
src/main/java/com/dreamchaser/depository_manage/service/impl/QyWxOperationService.java

@ -7,14 +7,12 @@ import com.dreamchaser.depository_manage.config.QyWxConfig;
import com.dreamchaser.depository_manage.config.QyWx_template_card.*;
import com.dreamchaser.depository_manage.controller.PageController;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.DepositoryMapper;
import com.dreamchaser.depository_manage.mapper.DepositoryRecordMapper;
import com.dreamchaser.depository_manage.mapper.MaterialMapper;
import com.dreamchaser.depository_manage.mapper.*;
import com.dreamchaser.depository_manage.pojo.ApplicationOutRecordP;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.pojo.StockTakingChildP;
import com.dreamchaser.depository_manage.utils.DateUtil;
import com.dreamchaser.depository_manage.utils.HttpUtils;
import org.apache.poi.ss.formula.functions.T;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@ -39,16 +37,23 @@ public class QyWxOperationService {
DepositoryMapper depositoryMapper;
@Autowired
RedisTemplate<String,String> redisTemplate;
RedisTemplate<String, String> redisTemplate;
@Autowired
StockTakingMapper stockTakingMapper;
@Autowired
PlaceMapper placeMapper;
/**
* 用于向企业微信发送消息
* 用于向企业微信发送出库消息
*
* @param uid 接收人
* @param outId 申请出库编号
* @param flag 用于判断发送类型是部门负责人还是仓储负责人(true为部门false为仓储)
* @return
*/
public JSONObject sendQyWxMessage(String uid, Integer outId, Boolean flag) {
public JSONObject sendQyWxToApplicationOutMessage(String uid, Integer outId, Boolean flag) {
// 获取将要发送申请的订单记录
ApplicationOutRecordP applicationOutRecordPById = depositoryRecordMapper.findApplicationOutRecordPById(outId);
@ -68,14 +73,14 @@ public class QyWxOperationService {
// 获取当前申请物料
Material materialById = materialMapper.findMaterialById(applicationOutRecordMin.getMid());
// 获取当前物料所在仓库
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(materialById.getDepositoryId());
Depository depositoryRecordById = depositoryMapper.findDepositoryById(materialById.getDepositoryId());
sumQuantity.append(applicationOutRecordMin.getQuantity()).append(",");
mname.append(materialById.getMname()).append(",");
depositoryName.append(depositoryRecordById.getDname()).append(",");
}
// 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token)?QyWxConfig.GetQYWXToken():QyWxConfig.token;
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token;
// 2.获取发送对象,并转成json
ButtonInteraction buttonInteraction = new ButtonInteraction();
// 1.1非必需
@ -118,8 +123,8 @@ public class QyWxOperationService {
// 一级标题
TemplateCard_main_title main_title = new TemplateCard_main_title();
// main_title.setTitle(applicant+"的出库申请");
main_title.setTitle(applicant.getName()+"的出库申请");
main_title.setDesc("申请时间:"+ DateUtil.TimeStampToDateTime(Long.valueOf(applicationOutRecordPById.getApplicantTime())));
main_title.setTitle(applicant.getName() + "的出库申请");
main_title.setDesc("申请时间:" + DateUtil.TimeStampToDateTime(Long.valueOf(applicationOutRecordPById.getApplicantTime())));
// 设置一级标题
templateCard_button_interaction.setMain_title(main_title);
@ -156,7 +161,7 @@ public class QyWxOperationService {
// 二级标题
horizontal_content_detail.setKeyname("申请明细");
horizontal_content_detail.setValue("查看明细");
horizontal_content_detail.setUrl("https://jy.hxgk.group/ApplicationOutView?id="+outId);
horizontal_content_detail.setUrl("https://jy.hxgk.group/ApplicationOutView?id=" + outId);
List<TemplateCard_horizontal_content> horizontal_contentList = new ArrayList<>();
@ -171,7 +176,7 @@ public class QyWxOperationService {
// 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节
// 通过雪花算法获取taskId
Snowflake snowflake = new Snowflake(10,10,true);
Snowflake snowflake = new Snowflake(10, 10, true);
templateCard_button_interaction.setTask_id(snowflake.nextIdStr());
// 下拉式的选择器
@ -184,10 +189,10 @@ public class QyWxOperationService {
// 选项
TemplateCard_button_selection_option button_selection_option = new TemplateCard_button_selection_option();
button_selection_option.setText("部门负责人");
if(flag) {
if (flag) {
// 如果是发送给部门负责人
button_selection_option.setId("btn_status_departManagerHead");
}else{
} else {
// 如果是发送给仓储负责人
button_selection_option.setId("btn_status_depositoryManager");
}
@ -201,12 +206,258 @@ public class QyWxOperationService {
List<TemplateCard_button> buttonList = new ArrayList<>();
TemplateCard_button button1 = new TemplateCard_button();
button1.setKey("wms_pass_outId"+outId);
button1.setKey("wms_pass_outId" + outId);
button1.setStyle(1);
button1.setText("通过");
TemplateCard_button button2 = new TemplateCard_button();
button2.setKey("wms_reject_outId" + outId);
button2.setStyle(2);
button2.setText("驳回");
buttonList.add(button1);
buttonList.add(button2);
templateCard_button_interaction.setButton_list(buttonList);
buttonInteraction.setTemplate_card(templateCard_button_interaction);
String s = JSONObject.toJSONString(buttonInteraction);
// 3.获取请求的url
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息
String s1 = HttpUtils.doPost(url, s);
// 将返回结果转为json对象
JSONObject jsonObject = JSON.parseObject(s1);
// 返回
return jsonObject;
}
/**
* 用于向企业微信发送盘点消息
* @param uid 接收人
* @param mainId 盘点记录编号
* @return
*/
public JSONObject sendQyWxToStockTakingMessage(String uid,Integer mainId){
// 获取盘点主记录
StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId);
// 获取所有子记录
List<StockTakingChildP> minRecordList = stockTakingMapper.selectStockTakingChildByMainId(mainId);
// 申请人id
Integer getOriginator = mainRecord.getOriginator();
// 申请人
UserByPort originator = PageController.FindUserById(getOriginator, null);
// 盘点物料名称
StringBuilder mname = new StringBuilder();
// 盘点位置
StringBuilder Location = new StringBuilder();
// 物料盘点数量
StringBuilder stockTakingQuantity = new StringBuilder();
// 物料盘点结果
StringBuilder stockTakingResult = new StringBuilder();
// 物料盘盈数量
StringBuilder stockTakingInventory = new StringBuilder();
// 获取盘点的库位
Integer placeId = mainRecord.getPlaceId();
Place place = placeMapper.findPlaceById(placeId);
// 获取盘点的仓库
Integer depositoryId = mainRecord.getDepositoryId();
Depository depository = depositoryMapper.findDepositoryById(depositoryId);
Location.append(depository.getDname());
if(Integer.compare(0,placeId) == 0){
// 如果盘点库位为默认库位
Location.append(" - 默认库位");
}else{
Location.append(" - ").append(place.getCode());
}
for (int i = 0; i < minRecordList.size(); i++) {
// 获取子订单信息
StockTakingChildP childP = minRecordList.get(i);
// 获取当前申请物料
Material materialById = materialMapper.findMaterialById(childP.getMid());
// 设置物料名称
mname.append(materialById.getMname()).append(",");
// 设置盘点数量
stockTakingQuantity.append(childP.getNewInventory()).append(",");
// 设置盘点结果
String takingResult = childP.getTakingResult();
if("Inventory_up".equals(takingResult)){
takingResult = "盘盈";
}else if("Inventory_down".equals(takingResult)){
takingResult = "盘亏";
}else if("Inventory_normal".equals(takingResult)){
takingResult = "正常";
}
stockTakingResult.append(takingResult).append(",");
// 设置盈亏数量
stockTakingInventory.append(childP.getInventory()).append(",");
}
// 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token;
// 2.获取发送对象,并转成json
ButtonInteraction buttonInteraction = new ButtonInteraction();
// 1.1非必需
//设置消息接收者
String[] split = uid.split(",");
StringBuilder toUserName = new StringBuilder();
for (int i = 0; i < split.length - 1; i++) {
toUserName.append(split[i]).append("|");
}
toUserName.append(split[split.length - 1]);
buttonInteraction.setTouser(toUserName.toString()); // 不区分大小写
// 1.2必需
// 消息类型
buttonInteraction.setMsgtype("template_card");
// 企业应用的id,整型
buttonInteraction.setAgentid(QyWxConfig.AgentId);
// 卡片模板
TemplateCard_button_interaction templateCard_button_interaction = new TemplateCard_button_interaction();
// 模板卡片类型,按钮交互型卡片填写"button_interaction"
templateCard_button_interaction.setCard_type("button_interaction");
// 卡片右上角更多操作按钮
TemplateCard_action_menu action_menu = new TemplateCard_action_menu();
action_menu.setDesc("卡片副交互辅助文本说明");
// 卡片右上角操作按钮
TemplateCard_action action1 = new TemplateCard_action();
action1.setKey("AcceptThePush");
action1.setText("接受推送");
TemplateCard_action action2 = new TemplateCard_action();
action2.setKey("NoPush");
action2.setText("不再推送");
List<TemplateCard_action> actionList = new ArrayList<>();
actionList.add(action1);
actionList.add(action2);
action_menu.setAction_list(actionList);
// 设置操作按钮
templateCard_button_interaction.setAction_menu(action_menu);
// 一级标题
TemplateCard_main_title main_title = new TemplateCard_main_title();
// main_title.setTitle(applicant+"的出库申请");
main_title.setTitle(originator.getName() + "的仓库盘点");
main_title.setDesc("申请时间:" + DateUtil.TimeStampToDateTime(Long.valueOf(mainRecord.getCreateTime())));
// 设置一级标题
templateCard_button_interaction.setMain_title(main_title);
// 二级标题+文本列表,用于设置盘点位置
TemplateCard_horizontal_content horizontal_content_Location = new TemplateCard_horizontal_content();
// 链接类型 0代表不是链接
horizontal_content_Location.setType(0);
// 二级标题
horizontal_content_Location.setKeyname("盘点位置");
horizontal_content_Location.setValue(Location.toString());
// 二级标题+文本列表,用于设置物料名称
TemplateCard_horizontal_content horizontal_content_mname = new TemplateCard_horizontal_content();
// 链接类型 0代表不是链接
horizontal_content_mname.setType(0);
// 二级标题
horizontal_content_mname.setKeyname("盘点物料:");
horizontal_content_mname.setValue(mname.toString());
// 二级标题+文本列表,用于设置盘点数量
TemplateCard_horizontal_content horizontal_content_quantity = new TemplateCard_horizontal_content();
// 链接类型 0代表不是链接
horizontal_content_quantity.setType(0);
// 二级标题
horizontal_content_quantity.setKeyname("盘点数量");
horizontal_content_quantity.setValue(stockTakingQuantity.toString());
// 二级标题+文本列表,用于设置盘点结果
TemplateCard_horizontal_content horizontal_content_result = new TemplateCard_horizontal_content();
// 链接类型 0代表不是链接
horizontal_content_result.setType(0);
// 二级标题
horizontal_content_result.setKeyname("盘点结果");
horizontal_content_result.setValue(stockTakingResult.toString());
// 二级标题+文本列表,用于设置盈亏数目
TemplateCard_horizontal_content horizontal_content_inventory = new TemplateCard_horizontal_content();
// 链接类型 0代表不是链接
horizontal_content_inventory.setType(0);
// 二级标题
horizontal_content_inventory.setKeyname("盈亏数量");
horizontal_content_inventory.setValue(stockTakingInventory.toString());
// 二级标题+文本列表,用于设置申请查看明细
TemplateCard_horizontal_content horizontal_content_detail = new TemplateCard_horizontal_content();
// 链接类型 0代表不是链接
horizontal_content_detail.setType(1);
// 二级标题
horizontal_content_detail.setKeyname("盘点明细");
horizontal_content_detail.setValue("查看明细");
horizontal_content_detail.setUrl("https://jy.hxgk.group/StockTakingView?id=" + mainId);
List<TemplateCard_horizontal_content> horizontal_contentList = new ArrayList<>();
horizontal_contentList.add(horizontal_content_mname);
horizontal_contentList.add(horizontal_content_quantity);
horizontal_contentList.add(horizontal_content_Location);
horizontal_contentList.add(horizontal_content_result);
horizontal_contentList.add(horizontal_content_inventory);
horizontal_contentList.add(horizontal_content_detail);
// 设置二级标题
templateCard_button_interaction.setHorizontal_content_list(horizontal_contentList);
// 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节
// 通过雪花算法获取taskId
Snowflake snowflake = new Snowflake(10, 10, true);
templateCard_button_interaction.setTask_id(snowflake.nextIdStr());
// 下拉式的选择器
TemplateCard_button_selection button_selection = new TemplateCard_button_selection();
// 下拉式的选择器的key
button_selection.setQuestion_key("btn_status");
button_selection.setTitle("您的身份");
List<TemplateCard_button_selection_option> optionList = new ArrayList<>();
// 选项
TemplateCard_button_selection_option button_selection_option = new TemplateCard_button_selection_option();
button_selection_option.setText("负责人");
// 如果是发送给部门负责人
button_selection_option.setId("btn_status_departManagerHead");
optionList.add(button_selection_option);
button_selection.setOption_list(optionList);
templateCard_button_interaction.setButton_selection(button_selection);
// 按钮列表,列表长度不超过6
List<TemplateCard_button> buttonList = new ArrayList<>();
TemplateCard_button button1 = new TemplateCard_button();
button1.setKey("wms_pass_StockTakingId" + mainId);
button1.setStyle(1);
button1.setText("通过");
TemplateCard_button button2 = new TemplateCard_button();
button2.setKey("wms_reject_outId"+outId);
button2.setKey("wms_reject_StockTakingId" + mainId);
button2.setStyle(2);
button2.setText("驳回");
@ -235,11 +486,12 @@ public class QyWxOperationService {
/**
* 将最终完成的订单抄送给仓储负责人
*
* @param uid 仓储负责人编号
* @param outId 订单编号
* @return
*/
public JSONObject sendCcMessageToUsers(String uid,Integer outId){
public JSONObject sendCcMessageToUsers(String uid, Integer outId) {
// 获取已经完成的订单
ApplicationOutRecordP recordP = depositoryRecordMapper.findApplicationOutRecordPById(outId);
// 申请人id
@ -249,6 +501,7 @@ public class QyWxOperationService {
// 获取所有子订单
List<ApplicationOutRecordMin> applicationOutRecordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(outId);
MessageByMarkDown markDown = new MessageByMarkDown();
//设置消息接收者
String[] split = uid.split(",");
@ -260,23 +513,22 @@ public class QyWxOperationService {
markDown.setTouser(toUserName.toString()); // 不区分大小写
// 设置agentId
markDown.setAgentid(QyWxConfig.AgentId);
markDown.setMsgtype("markdown");
// 设置content
Map<String,String> markdown = new HashMap<>();
Map<String, String> markdown = new HashMap<>();
StringBuilder content = new StringBuilder("## `抄送信息:`%n");
content.append(">### **"+applicant.getName()+"的出库申请** %n<font color='warning'>申请时间:2022-10-23 14:30:18</font> %n");
content.append(">### **" + applicant.getName() + "的出库申请** %n<font color='warning'>申请时间:" + recordP.getApplicantTime() + "</font> %n");
content.append("%n---%n");
for (ApplicationOutRecordMin recordMin : applicationOutRecordMinByParent) {
// 获取子订单信息
// 获取申请物料信息
Material materialById = materialMapper.findMaterialById(recordMin.getMid());
// 获取仓库信息
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(recordMin.getDepositoryId());
Depository depositoryRecordById = depositoryMapper.findDepositoryById(recordMin.getDepositoryId());
// 获取处理人信息
UserByPort userByPort = PageController.FindUserById(recordMin.getCheckId(), null);
content.append(">- 物料名称:").append(materialById.getMname()).append("%n");
@ -286,15 +538,146 @@ public class QyWxOperationService {
content.append("%n---%n");
}
content.append(">## '''%n" +
">如需要查看详细信息,请点击:[查看信息](https://jy.hxgk.group/ApplicationOutView?id="+recordP.getId()+")");
markdown.put("content",content.toString());
">如需要查看详细信息,请点击:[查看信息](https://jy.hxgk.group/ApplicationOutView?id=" + recordP.getId() + ")");
markdown.put("content", content.toString());
markDown.setMarkdown(markdown);
String jsonString = JSONObject.toJSONString(markDown);
jsonString = String.format(jsonString);
System.out.println(jsonString);
// 3.获取请求的url
// 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token;
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息
String s1 = HttpUtils.doPost(url, jsonString);
// 将返回结果转为json对象
JSONObject jsonObject = JSON.parseObject(s1);
// 返回
return jsonObject;
}
/**
* 将盘点记录抄送给负责人
*
* @param uid
* @param map
* @return
*/
public JSONObject sendCcStockTakingMessageToHead(String uid, Map<String, Object> map, UserByPort userToken, StockTaking mainRecord) {
/**
* 获取要转移的订单
*/
List<Integer> minIds = (List<Integer>) map.get("minIds");
MessageByMarkDown markDown = new MessageByMarkDown();
//设置消息接收者
String[] split = uid.split(",");
StringBuilder toUserName = new StringBuilder();
for (int i = 0; i < split.length - 1; i++) {
toUserName.append(split[i]).append("|");
}
toUserName.append(split[split.length - 1]);
markDown.setTouser(toUserName.toString()); // 不区分大小写
// 设置agentId
markDown.setAgentid(QyWxConfig.AgentId);
markDown.setMsgtype("markdown");
Map<String, String> markdown = new HashMap<>();
// 抄送内容
StringBuilder content = new StringBuilder("## `抄送信息:`%n");
// 获取发起人信息
UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), userToken);
// 设置content
content.append(">### **" + originator.getName() + "的物料转移记录** %n<font color='warning'>时间:" + DateUtil.TimeStampToDateTime(mainRecord.getCreateTime()) + "</font> %n");
content.append("%n---%n");
for (int i = 0; i < minIds.size(); i++) {
Integer minId = minIds.get(i);
// 获取对应子订单
StockTakingChildP minRecord = stockTakingMapper.selectStockTakingChildPById(minId);
// 获取当前物料
Material material = materialMapper.findMaterialById(minRecord.getMid());
// 获取转移数量
Integer inventory = ObjectFormatUtil.toInteger(map.get("inventory"));
// 获取转移前的库位
Integer oldPlaceId = ObjectFormatUtil.toInteger(mainRecord.getPlaceId());
Place oldPlace = placeMapper.findPlaceById(oldPlaceId);
// 获取转移后的数量
Integer newInventory = minRecord.getNewInventory() - inventory;
// 获取转移到的库位
Integer newPlaceId = ObjectFormatUtil.toInteger(map.get("placeId"));
Place newPlace = placeMapper.findPlaceById(newPlaceId);
// 盘点位置
String fromLocation = "";
// 转移位置
String toLocation = "";
// 获取转移前的仓库
Depository fromDepository = depositoryMapper.findDepositoryById(oldPlace.getDid());
// 获取转移后的仓库
Depository toDepository = depositoryMapper.findDepositoryById(newPlace.getDid());
if(Integer.compare(0,oldPlaceId) == 0){
// 如果转移前的位置为默认库位
fromLocation = fromDepository.getDname() + " - 默认库位";
}else{
fromLocation = fromDepository.getDname() + " - "+oldPlace.getCode();
}
if(Integer.compare(0,newPlaceId) == 0){
// 如果转移后的位置为默认库位
toLocation = toDepository.getDname() + " - 默认库位";
}else{
toLocation = toDepository.getDname() + " - "+newPlace.getCode();
}
//获取物料与转移前库位的对应关系
Map<String,Object> paramForMaterialAndPlace = new HashMap<>();
paramForMaterialAndPlace.put("mid",material.getId());
paramForMaterialAndPlace.put("pid",oldPlace.getId());
MaterialAndPlace oldPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
//获取物料与转移后库位的对应关系
paramForMaterialAndPlace.put("pid",newPlace.getId());
MaterialAndPlace newPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
content.append(">- 物料名称:").append(material.getMname()).append("%n");
content.append(">- 盘点数量:").append(minRecord.getNewInventory()).append("%n");
content.append(">- 盘点位置:").append(fromLocation).append("%n");
content.append(">- 转移数量:").append(map.get("inventory")).append("%n");
content.append(">- 转移位置:").append(toLocation).append("%n");
content.append(">- 转移后盘点位置物料数量:").append(oldPlaceAndMaterial.getQuantity()).append("%n");
content.append(">- 转移位置物料数量:").append(newPlaceAndMaterial.getQuantity()).append("%n");
content.append("%n---%n");
}
content.append(">## '''%n" +
">如需要查看详细信息,请点击:[查看信息](https://jy.hxgk.group/StockTakingView?id=" + mainRecord.getId() + ")");
markdown.put("content", content.toString());
markDown.setMarkdown(markdown);
String jsonString = JSONObject.toJSONString(markDown);
jsonString = String.format(jsonString);
System.out.println(jsonString);
// 3.获取请求的url
// 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token)?QyWxConfig.GetQYWXToken():QyWxConfig.token;
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token;
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息
@ -308,13 +691,24 @@ public class QyWxOperationService {
}
/**
* 将转移信息发送给盘点人员
* @param map
* @return
*/
public JSONObject sendCcStockTakingTransferMessageToHead(Map<String,Object>map){
return null;
}
/**
* 给仓库管理员发送出库通知
*
* @param uid
* @param outMinId
* @return
*/
public JSONObject sendNotificationToDepositoryManager(String uid,Integer outMinId){
public JSONObject sendNotificationToDepositoryManager(String uid, Integer outMinId) {
// 需要出库的子订单
ApplicationOutRecordMin recordMin = depositoryRecordMapper.findApplicationOutMinById(outMinId);
// 获取其主订单
@ -345,15 +739,15 @@ public class QyWxOperationService {
// 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节
// 通过雪花算法获取taskId
Snowflake snowflake = new Snowflake(10,10,true);
Snowflake snowflake = new Snowflake(10, 10, true);
text_notice.setTask_id(snowflake.nextIdStr());
textNotice.setMsgtype("template_card");
// 设置主标题
TemplateCard_main_title main_title = new TemplateCard_main_title();
main_title.setTitle(applicant.getName()+"的出库请求");
main_title.setDesc("申请时间:"+ DateUtil.TimeStampToDateTime(Long.valueOf(outRecordP.getApplicantTime())));
main_title.setTitle(applicant.getName() + "的出库请求");
main_title.setDesc("申请时间:" + DateUtil.TimeStampToDateTime(Long.valueOf(outRecordP.getApplicantTime())));
text_notice.setMain_title(main_title);
// 卡片右上角更多操作按钮
@ -374,13 +768,12 @@ public class QyWxOperationService {
text_notice.setAction_menu(action_menu);
List<TemplateCard_horizontal_content> horizontalContentList = new ArrayList<>();
// 获取申请物料信息
Material materialById = materialMapper.findMaterialById(recordMin.getMid());
// 获取仓库信息
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(recordMin.getDepositoryId());
Depository depositoryRecordById = depositoryMapper.findDepositoryById(recordMin.getDepositoryId());
// 设至二级标题
// 物料名称
TemplateCard_horizontal_content horizontal_content_mname = new TemplateCard_horizontal_content();
@ -391,7 +784,7 @@ public class QyWxOperationService {
TemplateCard_horizontal_content horizontal_content_mcode = new TemplateCard_horizontal_content();
horizontal_content_mcode.setType(0);
horizontal_content_mcode.setKeyname("物料编码:");
horizontal_content_mcode.setValue(materialById.getCode().toString());
horizontal_content_mcode.setValue(materialById.getCode());
// 申请数量
TemplateCard_horizontal_content horizontal_content_quantity = new TemplateCard_horizontal_content();
horizontal_content_quantity.setType(0);
@ -420,7 +813,7 @@ public class QyWxOperationService {
// 卡片整体点击事件
TemplateCard_card_action card_action = new TemplateCard_card_action();
card_action.setType(1);
card_action.setUrl("https://jy.hxgk.group/ApplicationOutMinByDidForMobile?depositoryId="+depositoryRecordById.getId()+"&state=0");
card_action.setUrl("https://jy.hxgk.group/ApplicationOutMinByDidForMobile?depositoryId=" + depositoryRecordById.getId() + "&state=0");
text_notice.setCard_action(card_action);
//跳转指引样式的列表
@ -438,7 +831,7 @@ public class QyWxOperationService {
// 3.获取请求的url
// 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url
String accessToken = "".equals(QyWxConfig.token)?QyWxConfig.GetQYWXToken():QyWxConfig.token;
String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token;
String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken);
// 4.调用接口,发送消息
@ -450,24 +843,26 @@ public class QyWxOperationService {
// 返回
return jsonObject;
}
/**
* 用于撤回发送给企业微信的消息
*
* @param msgid 待撤回消息的id
* @return
*/
public String withdrawQyWxMessage(String msgid){
public String withdrawQyWxMessage(String msgid) {
String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/recall?access_token=%s", QyWxConfig.token);
Map<String,Object> param = new HashMap<>();
param.put("msgid",msgid);
Map<String, Object> param = new HashMap<>();
param.put("msgid", msgid);
String jsonString = JSONObject.toJSONString(param);
String post = HttpUtils.doPost(url, jsonString);
JSONObject jsonObject = JSON.parseObject(post);
String errmsg = jsonObject.getString("errmsg");
Integer errcode = jsonObject.getInteger("errcode");
if(errcode == 0){
if (errcode == 0) {
// 如果撤回成功
return errmsg;
}else{
} else {
return errmsg;
}
}
@ -475,18 +870,19 @@ public class QyWxOperationService {
/**
* 用于更新卡片中的按钮为不可点击状态
*
* @param response_code
* @return
*/
public JSONObject updateTemplateCard(String response_code,String userName,String state){
String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/update_template_card?access_token="+QyWxConfig.token+"&debug=1");
Map<String,Object> map = new HashMap<>();
map.put("atall",1);
map.put("agentid",QyWxConfig.AgentId);
map.put("response_code",response_code);
Map<String,Object> button = new HashMap<>();
button.put("replace_name",userName+"已"+state);
map.put("button",button);
public JSONObject updateTemplateCard(String response_code, String userName, String state) {
String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/update_template_card?access_token=" + QyWxConfig.token + "&debug=1");
Map<String, Object> map = new HashMap<>();
map.put("atall", 1);
map.put("agentid", QyWxConfig.AgentId);
map.put("response_code", response_code);
Map<String, Object> button = new HashMap<>();
button.put("replace_name", userName + "已" + state);
map.put("button", button);
String jsonString = JSONObject.toJSONString(map);
String s1 = HttpUtils.doPost(url, jsonString);
JSONObject jsonObject = JSON.parseObject(s1);

867
src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java

@ -0,0 +1,867 @@
package com.dreamchaser.depository_manage.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.controller.PageController;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.mapper.DepositoryMapper;
import com.dreamchaser.depository_manage.mapper.MaterialMapper;
import com.dreamchaser.depository_manage.mapper.PlaceMapper;
import com.dreamchaser.depository_manage.mapper.StockTakingMapper;
import com.dreamchaser.depository_manage.pojo.SimpleStockTakingP;
import com.dreamchaser.depository_manage.pojo.StockTakingChildP;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.StockTakingService;
import com.dreamchaser.depository_manage.utils.DateUtil;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import com.dreamchaser.depository_manage.utils.WordUtil;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Service
public class StockTakingServiceImpl implements StockTakingService {
@Autowired
StockTakingMapper stockTakingMapper;
@Autowired
DepositoryMapper depositoryMapper;
@Autowired
PlaceMapper placeMapper;
@Autowired
RedissonClient redissonClient;
@Autowired
RedisTemplate<String, String> redisTemplate;
@Autowired
MaterialMapper materialMapper;
@Autowired
DepositoryRecordService depositoryRecordService;
@Autowired
QyWxOperationService qyWxOperationService;
/**
* 用于插入盘点记录主表
*
* @param map
* @return
*/
@Transactional
@Override
public Integer insertStockTaking(Map<String, Object> map) {
// 设置盘点时间
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("createTime", DateUtil.DateTimeToTimeStamp(simpleTime));
// 获取盘点位置
String placeId = (String) map.get("placeId");
Depository depository = null;
if ("0".equals(placeId)) {
// 如果是默认库位
// 获取仓库
depository = depositoryMapper.findDepositoryById(ObjectFormatUtil.toInteger(map.get("depositoryId")));
} else {
Place place = placeMapper.findPlaceById(ObjectFormatUtil.toInteger(placeId));
depository = depositoryMapper.findDepositoryById(place.getDid());
}
map.put("code", createTakingCode(depository.getDname()));
if (!map.containsKey("mainId")) {
stockTakingMapper.insertStockTaking(map);
Object id = map.get("id");
map.remove("id");
map.put("mainId", id);
}
return stockTakingMapper.insertStockTakingChild(map);
}
/**
* 用于插入盘点记录主表
*
* @param st
* @return
*/
@Transactional
@Override
public Integer insertStockTaking(StockTaking st) {
return null;
}
/**
* 根据条件查询自己的任务根据isDone来决定查询已完成或者未完成的任务同时支持分页查询需要begin和size参数
*
* @param map 查询参数
* @return 我的任务
*/
@Override
public List<SimpleStockTakingP> findMyTask(Map<String, Object> map, HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
Integer size = 10, page = 1;
if (map.containsKey("size")) {
size = ObjectFormatUtil.toInteger(map.get("size"));
map.put("size", size);
}
if (map.containsKey("page")) {
page = ObjectFormatUtil.toInteger(map.get("page"));
map.put("begin", (page - 1) * size);
}
List<StockTaking> myTask = stockTakingMapper.findMyTask(map);
List<SimpleStockTakingP> stockTakingPS = new ArrayList<>();
for (int i = 0; i < myTask.size(); i++) {
StockTaking stockTaking = myTask.get(i);
SimpleStockTakingP ssp = new SimpleStockTakingP(stockTaking);
Depository depositoryRecordById = depositoryMapper.findDepositoryById(stockTaking.getDepositoryId());
ssp.setDepositoryName(depositoryRecordById.getDname());
UserByPort userByPort = PageController.FindUserById(stockTaking.getOriginator(), userToken);
ssp.setOriginatorName(userByPort.getName());
stockTakingPS.add(ssp);
}
return stockTakingPS;
}
/**
* 根据条件查询自己的任务数目
*
* @param map
* @return
*/
@Override
public Integer findMyTaskCount(Map<String, Object> map) {
return stockTakingMapper.findMyTaskCount(map);
}
/**
* 根据条件查询自己的申请
* @param map 查询参数
* @return 我的任务
*/
@Override
public List<SimpleStockTakingP> findMyApply(Map<String, Object> map, HttpServletRequest request) {
Integer size = 10, page = 1;
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
if (map.containsKey("size")) {
size = ObjectFormatUtil.toInteger(map.get("size"));
map.put("size", size);
}
if (map.containsKey("page")) {
page = ObjectFormatUtil.toInteger(map.get("page"));
map.put("begin", (page - 1) * size);
}
List<StockTaking> myTask = stockTakingMapper.findMyTask(map);
List<SimpleStockTakingP> stockTakingPS = new ArrayList<>();
for (int i = 0; i < myTask.size(); i++) {
StockTaking stockTaking = myTask.get(i);
SimpleStockTakingP ssp = new SimpleStockTakingP(stockTaking);
Depository depositoryRecordById = depositoryMapper.findDepositoryById(stockTaking.getDepositoryId());
ssp.setDepositoryName(depositoryRecordById.getDname());
UserByPort userByPort = PageController.FindUserById(stockTaking.getOriginator(), userToken);
ssp.setOriginatorName(userByPort.getName());
stockTakingPS.add(ssp);
}
return stockTakingPS;
}
/**
* 查询用户的申请数量
* @param map
* @return
*/
@Override
public Integer findMyApplyCount(Map<String, Object> map) {
return stockTakingMapper.findMyApplyCount(map);
}
/**
* 根据主键查询主表
*
* @param id
* @return
*/
@Override
public StockTaking findStockTakingById(Integer id) {
return stockTakingMapper.selectStockTakingById(id);
}
/**
* 根据主键查询主表
*
* @param id
* @return
*/
@Override
public StockTaking findStockTakingById(Long id) {
return stockTakingMapper.selectStockTakingById(id);
}
/**
* 根据主表获取所有子表
*
* @param mainId
* @return
*/
@Override
public List<StockTakingChildP> findStockTakingChildPByMainId(Integer mainId) {
List<StockTakingChildP> stockTakingChildPS = stockTakingMapper.selectStockTakingChildByMainId(mainId);
for (int i = 0; i < stockTakingChildPS.size(); i++) {
StockTakingChildP stockTakingChildP = stockTakingChildPS.get(i);
if ("Inventory_up".equals(stockTakingChildP.getTakingResult())) {
stockTakingChildPS.get(i).setTakingResultShow("盘盈");
} else if ("Inventory_down".equals(stockTakingChildP.getTakingResult())) {
stockTakingChildPS.get(i).setTakingResultShow("盘亏");
} else {
stockTakingChildPS.get(i).setTakingResultShow("正常");
}
}
return stockTakingChildPS;
}
/**
* 根据主键获取子表
*
* @param id
* @return
*/
@Override
public StockTakingChildP findStockTakingChildPById(Integer id) {
return stockTakingMapper.selectStockTakingChildPById(id);
}
/**
* 用于对盘点进行审核
*
* @param map
* @param userToken
* @return
*/
@Transactional
@Override
public Map<String, Object> review(Map<String, Object> map, UserByPort userToken) {
Map<String, Object> result = new HashMap<>();
StringBuilder QyWxUid = new StringBuilder();
Integer state = ObjectFormatUtil.toInteger(map.get("state"));
Object o = (map.get("mainId"));
Integer res = 0;
if (o == null) {
throw new MyException("缺少必要参数");
}
String stockTakingResult = "驳回";
// 获取主表编号
Integer mainId = ObjectFormatUtil.toInteger(o);
// 获取主单
StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId);
// 获取负责人
String departmentManager = mainRecord.getDepartmentManager();
String[] split = departmentManager.split(",");
for (int i = 0; i < split.length; i++) {
String s = split[i];
if("".equals(s)){
continue;
}
UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(s), userToken);
QyWxUid.append(userByPort.getWorkwechat()).append(",");
}
if (Integer.compare(state, 1) == 0) {
// 如果审核通过
stockTakingResult = "通过";
// 定义错误信息
Map<String, Object> errMsg = new HashMap<>();
// 定义出错单号
List<Long> errIds = new ArrayList<>();
// 定义出错信息
List<String> err = new ArrayList<>();
Integer placeId = mainRecord.getPlaceId();
// 获取库位详情
Place placeById = placeMapper.findPlaceById(placeId);
Integer depositoryId = mainRecord.getDepositoryId();
// 获取仓库详情
Depository depositoryById = depositoryMapper.findDepositoryById(depositoryId);
// 获取所有子单
List<StockTakingChildP> minRecordList = stockTakingMapper.selectStockTakingChildByMainId(mainId);
for (int i = 0; i < minRecordList.size(); i++) {
// 获取子单详情
StockTakingChildP minRecord = minRecordList.get(i);
// 获取盘点的物料详情
// 获取当前盘点结果
String takingResult = minRecord.getTakingResult();
if ("Inventory_normal".equals(takingResult)) {
// 如果盘点结果正常
continue;
}
// 获取盈亏数量
Integer inventory = minRecord.getInventory();
Material materialById = materialMapper.findMaterialById(minRecord.getMid());
Map<String, Object> paramForMaterialAndPlace = new HashMap<>();
paramForMaterialAndPlace.put("mid", materialById.getId());
paramForMaterialAndPlace.put("pid", placeById.getId());
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
// 根据盘点结果重新计算物料的单价
// 数据库中的总额
Double amounts = (materialById.getAmounts() / 100);
Integer newInventory = minRecord.getNewInventory();
Double avgPrice = 0.0;
if (Integer.compare(newInventory, 0) != 0) {
// 如果新的库存不是0
// 新的均价
avgPrice = (amounts / newInventory) * 100;
}
materialById.setPrice(avgPrice);
// 获取当前库位上物料数量
Integer oldQuantity = materialById.getQuantity() - placeAndMaterialByMidAndPid.getQuantity();
materialById.setQuantity(oldQuantity + newInventory);
// 用于计算新的库位数量
Integer newNumberForPlace = 0;
// 用于计算新的库位与物料对应关系的数量
Integer newNumberForMatrialAndPlace = 0;
if ("Inventory_up".equals(takingResult)) {
// 如果盘盈
// 更新当前库位数量
newNumberForPlace = placeById.getQuantity() + inventory;
if (newNumberForPlace < placeById.getMax()) {
// 如果更新后的库位数量没有上溢
// 更新当前库位的数量
placeById.setQuantity(newNumberForPlace);
} else {
// 添加错误信息
errIds.add(minRecord.getId());
err.add("当前库位数量溢出,需要转移");
continue;
}
newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() + inventory;
// 更新物料与库位对应关系的数量
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
} else {
// 如果盘亏
newNumberForPlace = placeById.getQuantity() - inventory;
if (newNumberForPlace > placeById.getMin()) {
//如果更新后的库位数量没有下溢
// 更新当前库位数量
placeById.setQuantity(newNumberForPlace);
// 更新物料与库位对应关系的数量
newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() - inventory;
} else {
placeById.setQuantity(0);
newNumberForMatrialAndPlace = 0;
}
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
}
// 更新库位
placeMapper.UpdatePlace(placeById);
// 更新库位与物料的对应关系
placeMapper.updateMaterialAndPlace(placeAndMaterialByMidAndPid);
// 更新当前物料信息
materialMapper.updateMaterial(materialById);
}
if (errIds.size() > 0) {
// 如果有出错的情况
errMsg.put("errIds", errIds);
errMsg.put("errMsg", err);
result.put("errMsg", errMsg);
}
}
// 更新结果
map.put("id", mainId);
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("completeTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("departmentManager",userToken.getId());
stockTakingMapper.updateStockTaking(map);
// 更新
String finalStockTakingResult = stockTakingResult;
new Thread(new Runnable() {
@Override
public void run() {
// 获取responseCode(key为申请人number)
//获取申请人信息
String key = "user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId;
String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode");
qyWxOperationService.updateTemplateCard(responseCode,userToken.getName(), finalStockTakingResult);
}
}).start();
return result;
}
/**
* 用于进行盘点结果转移
* @param map
* @return
*/
@Transactional
@Override
public Integer stockTakingTransfer(Map<String, Object> map,UserByPort userToken) {
List<Integer> minIds = (List<Integer>) map.get("minIds");
Integer res = 0;
// 获取对应主订单
StockTaking mainRecord = null;
for (int i = 0; i < minIds.size(); i++) {
Integer minId = minIds.get(i);
// 获取对应子订单
StockTakingChildP minRecord = stockTakingMapper.selectStockTakingChildPById(minId);
// 获取当前物料
Material material = materialMapper.findMaterialById(minRecord.getMid());
// 获取对应主订单
mainRecord = stockTakingMapper.selectStockTakingById(minRecord.getMainId());
// 获取转移数量
Integer inventory = ObjectFormatUtil.toInteger(map.get("inventory"));
// 获取转移前的库位
Integer oldPlaceId = ObjectFormatUtil.toInteger(mainRecord.getPlaceId());
Place oldPlace = placeMapper.findPlaceById(oldPlaceId);
// 获取转移后的数量
Integer newInventory = minRecord.getNewInventory() - inventory;
// 获取转移到的库位
Integer newPlaceId = ObjectFormatUtil.toInteger(map.get("placeId"));
Place newPlace = placeMapper.findPlaceById(newPlaceId);
if(Integer.compare(newPlace.getDid(),oldPlace.getDid()) != 0){
// 转移前后不在同一仓库
material.setQuantity(newInventory);
// 进行物料转移
Map<String,Object> paramForMaterialToDepository = new HashMap<>();
paramForMaterialToDepository.put("depositoryId",newPlace.getDid());
paramForMaterialToDepository.put("code",material.getCode());
// 获取转移后的仓库中的该物料
List<Material> materialByDepository = materialMapper.findInventory(paramForMaterialToDepository);
if(materialByDepository.size() > 0){
// 如果转移后的仓库中存在该物料
Material transferMaterial = materialByDepository.get(0);
//获取物料与转移后库位的对应关系
Map<String,Object> paramForMaterialAndPlace = new HashMap<>();
paramForMaterialAndPlace.put("mid",transferMaterial.getId());
paramForMaterialAndPlace.put("pid",newPlace.getId());
MaterialAndPlace newPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
if(newPlaceAndMaterial == null){
// 如果转移之后没有该物料
paramForMaterialAndPlace.put("quantity",inventory);
placeMapper.addMaterialOnPlace(paramForMaterialAndPlace);
}else{
// 如果转移之后有该物料
newPlaceAndMaterial.setQuantity(newPlaceAndMaterial.getQuantity() + inventory);
placeMapper.updateMaterialAndPlace(newPlaceAndMaterial);
}
}
else{
// 如果不存在
Material mt = new Material();
mt.setQuantity(inventory);
mt.setDepositoryId(newPlace.getDid());
mt.setAmounts(inventory * material.getPrice());
mt.setPrice(material.getPrice());
mt.setMaterialTypeId(material.getMaterialTypeId());
mt.setTexture(material.getTexture());
mt.setUnit(material.getUnit());
mt.setVersion(material.getVersion());
mt.setMname(material.getMname());
mt.setCode(material.getCode());
mt.setState(material.getState());
materialMapper.insertMaterial(mt);
// 添加当前物料与库位之间的映射
Map<String,Object> paramForMaterialAndPlace = new HashMap<>();
paramForMaterialAndPlace.put("mid",mt.getId());
paramForMaterialAndPlace.put("pid",newPlace.getId());
paramForMaterialAndPlace.put("quantity",newInventory);
placeMapper.addMaterialOnPlace(paramForMaterialAndPlace);
}
//获取物料与转移前库位的对应关系
Map<String,Object> paramForMaterialAndPlace = new HashMap<>();
paramForMaterialAndPlace.put("mid",material.getId());
paramForMaterialAndPlace.put("pid",oldPlace.getId());
MaterialAndPlace oldPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
if(oldPlaceAndMaterial == null){
// 如果转移之前没有该物料
paramForMaterialAndPlace.put("quantity",newInventory);
placeMapper.addMaterialOnPlace(paramForMaterialAndPlace);
}
else{
// 如果转移之前有该物料
oldPlaceAndMaterial.setQuantity(oldPlaceAndMaterial.getQuantity() + newInventory);
placeMapper.updateMaterialAndPlace(oldPlaceAndMaterial);
}
}
else{
// 如果在同一仓库
// 更新物料容量
material.setQuantity(minRecord.getNewInventory());
//获取物料与转移前库位的对应关系
Map<String,Object> paramForMaterialAndPlace = new HashMap<>();
paramForMaterialAndPlace.put("mid",material.getId());
paramForMaterialAndPlace.put("pid",oldPlace.getId());
MaterialAndPlace oldPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
if(oldPlaceAndMaterial == null){
// 如果转移之前没有该物料
paramForMaterialAndPlace.put("quantity",newInventory);
placeMapper.addMaterialOnPlace(paramForMaterialAndPlace);
}else{
// 如果转移之前有该物料
oldPlaceAndMaterial.setQuantity(oldPlaceAndMaterial.getQuantity() + newInventory);
placeMapper.updateMaterialAndPlace(oldPlaceAndMaterial);
}
// 获取物料与转移后库位的对应关系
paramForMaterialAndPlace.put("pid",newPlace.getId());
MaterialAndPlace newPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
if(newPlaceAndMaterial == null){
// 如果转移后没有该物料
paramForMaterialAndPlace.put("quantity",inventory);
placeMapper.addMaterialOnPlace(paramForMaterialAndPlace);
}else{
// 如果转移后有该物料
newPlaceAndMaterial.setQuantity(newPlaceAndMaterial.getQuantity() + inventory);
placeMapper.updateMaterialAndPlace(newPlaceAndMaterial);
}
}
// 更新要转移的物料数据
res += materialMapper.updateMaterial(material);
// 更新转移前库位数量
oldPlace.setQuantity(oldPlace.getQuantity() + newInventory);
placeMapper.UpdatePlace(oldPlace);
// 更新转移后库位数量
newPlace.setQuantity(newPlace.getQuantity() + inventory);
placeMapper.UpdatePlace(newPlace);
}
// 开启一个线程用于发送抄送信息给盘点人员
StockTaking finalMainRecord = mainRecord;
new Thread(new Runnable() {
@Override
public void run() {
Integer originator = finalMainRecord.getOriginator();
StringBuilder departMentHeadQyWxName = new StringBuilder();
UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(originator), userToken);
// departMentHeadQyWxName.append(userByPort.getWorkwechat()+",");
departMentHeadQyWxName.append("PangFuZhen,");
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(departMentHeadQyWxName.toString(), map, userToken, finalMainRecord);
}
}).start();
/* // 开启一个线程用于发送抄送信息给盘点人员
StockTaking finalMainRecord = mainRecord;
new Thread(new Runnable() {
@Override
public void run() {
String departmentManager = finalMainRecord.getDepartmentManager();
String[] strings = departmentManager.split(",");
StringBuilder departMentHeadQyWxName = new StringBuilder();
for (int j = 0; j < strings.length; j++) {
String s = strings[j];
if("".equals(s)){
continue;
}
UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(s), userToken);
departMentHeadQyWxName.append(userByPort.getWorkwechat()+",");
}
JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(departMentHeadQyWxName.toString(), map, userToken, finalMainRecord);
}
}).start();*/
return res;
}
/**
* 用于企业微信的审核申请处理
* @param templateCard
* @return
*/
@Transactional
@Override
public Integer reviewByQyWx(TemplateCard templateCard) {
Map<String, Object> result = new HashMap<>();
// 获取点击的按钮
String clickKey = templateCard.getEventKey().split("_")[1];
// 点击用户
String fromUserName = templateCard.getFromUserName();
// 根据userId获取处理人
Map<String, Object> portInfo = PortConfig.findUserByQyWxUserId(fromUserName);
UserByPort userByPort = (UserByPort) portInfo.get("user");
// 用于最终更新
Map<String,Object> map = new HashMap<>();
// 获取主表编号
String o = templateCard.getEventKey().split("wms_pass_StockTakingId")[1];
Integer mainId = ObjectFormatUtil.toInteger(o);
// 获取主单
StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId);
Integer state = 2;
if ("pass".equals(clickKey)) {
// 如果审核通过
state = 1;
// 定义错误信息
Map<String, Object> errMsg = new HashMap<>();
// 定义出错单号
List<Long> errIds = new ArrayList<>();
// 定义出错信息
List<String> err = new ArrayList<>();
Integer placeId = mainRecord.getPlaceId();
// 获取库位详情
Place placeById = placeMapper.findPlaceById(placeId);
Integer depositoryId = mainRecord.getDepositoryId();
// 获取仓库详情
Depository depositoryById = depositoryMapper.findDepositoryById(depositoryId);
// 获取所有子单
List<StockTakingChildP> minRecordList = stockTakingMapper.selectStockTakingChildByMainId(mainId);
for (int i = 0; i < minRecordList.size(); i++) {
// 获取子单详情
StockTakingChildP minRecord = minRecordList.get(i);
// 获取盘点的物料详情
// 获取当前盘点结果
String takingResult = minRecord.getTakingResult();
if ("Inventory_normal".equals(takingResult)) {
// 如果盘点结果正常
continue;
}
// 获取盈亏数量
Integer inventory = minRecord.getInventory();
Material materialById = materialMapper.findMaterialById(minRecord.getMid());
Map<String, Object> paramForMaterialAndPlace = new HashMap<>();
paramForMaterialAndPlace.put("mid", materialById.getId());
paramForMaterialAndPlace.put("pid", placeById.getId());
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace);
// 根据盘点结果重新计算物料的单价
// 数据库中的总额
Double amounts = (materialById.getAmounts() / 100);
Integer newInventory = minRecord.getNewInventory();
Double avgPrice = 0.0;
if (Integer.compare(newInventory, 0) != 0) {
// 如果新的库存不是0
// 新的均价
avgPrice = (amounts / newInventory) * 100;
}
materialById.setPrice(avgPrice);
// 获取当前库位上物料数量
Integer oldQuantity = materialById.getQuantity() - placeAndMaterialByMidAndPid.getQuantity();
materialById.setQuantity(oldQuantity + newInventory);
// 用于计算新的库位数量
Integer newNumberForPlace = 0;
// 用于计算新的库位与物料对应关系的数量
Integer newNumberForMatrialAndPlace = 0;
if ("Inventory_up".equals(takingResult)) {
// 如果盘盈
// 更新当前库位数量
newNumberForPlace = placeById.getQuantity() + inventory;
if (newNumberForPlace < placeById.getMax()) {
// 如果更新后的库位数量没有上溢
// 更新当前库位的数量
placeById.setQuantity(newNumberForPlace);
} else {
// 添加错误信息
errIds.add(minRecord.getId());
err.add("当前库位数量溢出,需要转移");
continue;
}
newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() + inventory;
// 更新物料与库位对应关系的数量
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
} else {
// 如果盘亏
newNumberForPlace = placeById.getQuantity() - inventory;
if (newNumberForPlace > placeById.getMin()) {
//如果更新后的库位数量没有下溢
// 更新当前库位数量
placeById.setQuantity(newNumberForPlace);
// 更新物料与库位对应关系的数量
newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() - inventory;
} else {
placeById.setQuantity(0);
newNumberForMatrialAndPlace = 0;
}
placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace);
}
// 更新库位
placeMapper.UpdatePlace(placeById);
// 更新库位与物料的对应关系
placeMapper.updateMaterialAndPlace(placeAndMaterialByMidAndPid);
// 更新当前物料信息
materialMapper.updateMaterial(materialById);
}
if (errIds.size() > 0) {
// 如果有出错的情况
errMsg.put("errIds", errIds);
errMsg.put("errMsg", err);
result.put("errMsg", errMsg);
}
}
// 更新结果
map.put("id", mainId);
map.put("state",state);
String simpleTime = DateUtil.getSimpleTime(new Date());
map.put("completeTime", DateUtil.DateTimeToTimeStamp(simpleTime));
map.put("departmentManager",userByPort.getId());
stockTakingMapper.updateStockTaking(map);
return 1;
}
public String createTakingCode(String depositoryName) {
String key = "wms_stockTakingNumber";
RLock lock = redissonClient.getLock(key);
String first = "GK";
// 获取仓库的首字母
depositoryName = WordUtil.getPinYinHeadChar(depositoryName);
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));
String code = first + depositoryName + nowTime + orderNumber;
return code;
}
}

3
src/main/resources/templates/pages/application/application-in.html

@ -207,10 +207,9 @@
let scanValue = {};
// 用于卡片编号
var NewIdNumber = 1;
layui.use(['form', 'miniTab', 'step', 'flow'], function () {
layui.use(['form', 'step', 'flow'], function () {
var $ = layui.$,
form = layui.form,
miniTab = layui.miniTab,
step = layui.step;
// 用于分步表单加载

44
src/main/resources/templates/pages/application/my-apply.html

@ -43,6 +43,9 @@
};
function openDetailOut(data) {
};
function openDetailTaking(data){
};
layui.use(['flow', 'layer', 'flow', 'util'], function () {
var $ = layui.jquery,
@ -51,6 +54,7 @@
util = layui.util;
let size = 8;
let inpre = 0;
let takingPre = 0;
let outpre = 0;
flow.load({
elem: '#LAY_floor_in' //流加载容器
@ -81,6 +85,29 @@
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis.join(''), inpre < InCount);
});
let lis1 = [];
$.get('/stockTaking/myApply?page=' + page + '&size=' + size, function (res) {
result = res.data;
var Width = "25%";
if (isMobile()) {
Width = "50%";
}
for (let i=0;i<result.length;i++){
lis1.push('<li style="width:'+ Width +';float:left;"><div class="layui-card my-shadow my-card flow1" onclick="openDetailTaking('
+result[i].id+')"><div class="layui-card-header"><h2>'
+result[i].originatorName+'的');
lis1.push('盘点记录</h2></div>');
lis1.push('<div class="layui-col-md4 my-time" style="margin-left: 15px; color: #999;font-size: 12px;">'
+result[i].createTime+'</div></div></li>');
}
lis1.push('</div>');
lis1.push('<hr class="layui-border-black">')
takingPre+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis1.join(''), takingPre < res.count);
});
}
});
flow.load({
@ -145,6 +172,23 @@
layer.full(index);
});
};
openDetailTaking = function (data) {
var index = layer.open({
title: '请求详情',
type: 2,
shade: 0.2,
maxmin: true,
shadeClose: true,
area: ['100%', '100%'],
content: '/StockTakingView?id='+data,
end:function () {
location.reload()
}
});
$(window).on("resize", function () {
layer.full(index);
});
};
//定义一个函数判断是手机端还是pc端
function isMobile() {

106
src/main/resources/templates/pages/application/my-task.html

@ -78,6 +78,15 @@
// 用于手机端跳转
function openDetail4_mobile(data) {
};
//先声明(用于pc端跳转)
function openDetailForTaking(data){
}
function openDetailTaking(data){
}
layui.use(['flow', 'layer', 'table', 'util'], function () {
var $ = layui.jquery,
layer = layui.layer,
@ -86,22 +95,23 @@
util = layui.util;
//每页的数量
var size=8;
let pre1=0,pre2=0;
let pre1=0,pre2=0,pre3 = 0,pre4 = 0;
flow.load({
elem: '#LAY_floor1' //流加载容器
,scrollElem: '#LAY_floor1' //滚动条所在元素,一般不用填,此处只是演示需要。
,isAuto:false
,done: function(page, next){ //执行下一页的回调
let lis = [];
let lis1 = [];
let result;
$.get('/depositoryRecord/myTask?page='+page+'&size='+size+'&isDone=0', function(res){
var Width = "25%";
result=res.data;
lis.push("<div class='clearfix'>")
for (let i=0;i<result.length;i++){
lis.push("<div class='clearfix'>");
if(isMobile()){
Width = "50%";
}
for (let i=0;i<result.length;i++){
lis.push('<li style="width:'+ Width +';float:left;"><div class="layui-card my-shadow my-card flow1" onclick="openDetail1('
+result[i].id+')"><div class="layui-card-header"><h2>'
+result[i].applicantName+'的');
@ -110,11 +120,35 @@
+result[i].applicantTime+'</div></div></li>');
}
lis.push('</div>');
lis.push('<hr class="layui-border-black">')
pre1+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis.join(''), pre1 < res.count);
});
$.get('/stockTaking/myTask?page='+page+'&size='+size+'&isDone=0', function(res){
var Width = "25%";
result=res.data;
lis1.push("<div class='clearfix'>");
if(isMobile()){
Width = "50%";
}
for (let i=0;i<result.length;i++){
lis1.push('<li style="width:'+ Width +';float:left;"><div class="layui-card my-shadow my-card flow1" onclick="openDetailForTaking('
+result[i].id+')"><div class="layui-card-header"><h2>'
+result[i].originatorName+'的');
lis1.push('盘点记录</h2></div>');
lis1.push('<div class="layui-col-md4 my-time" style="margin-left: 15px; color: #999;font-size: 12px;">'
+result[i].createTime+'</div></div></li>');
}
lis1.push('</div>');
lis1.push('<hr class="layui-border-black">')
pre3+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis1.join(''), pre3 < res.count);
});
}
});
flow.load({
@ -123,6 +157,7 @@
,isAuto:false
,done: function(page, next){ //执行下一页的回调
let lis = [];
let lis1 = [];
let result;
$.get('/depositoryRecord/myTask?page='+page+'&size='+size+'&isDone=1', function(res){
var Width = "25%";
@ -143,12 +178,35 @@
lis.push('<div class="layui-col-md4 my-time" style="margin-left: 15px; color: #999;font-size: 12px;">'
+result[i].applicantTime+'</div></div></li>');
}
lis.push("</div>")
lis.push("</div>");
lis.push('<hr class="layui-border-black">');
pre2+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis.join(''), pre2 < res.count);
});
$.get('/stockTaking/myTask?page='+page+'&size='+size+'&isDone=1', function(res){
var Width = "25%";
result=res.data;
lis1.push("<div class='clearfix'>");
if(isMobile()){
Width = "50%";
}
for (let i=0;i<result.length;i++){
lis1.push('<li style="width:'+ Width +';float:left;"><div class="layui-card my-shadow my-card flow1" onclick="openDetailTaking('
+result[i].id+')"><div class="layui-card-header"><h2>'
+result[i].originatorName+'的');
lis1.push('盘点记录</h2></div>');
lis1.push('<div class="layui-col-md4 my-time" style="margin-left: 15px; color: #999;font-size: 12px;">'
+result[i].createTime+'</div></div></li>');
}
lis1.push('</div>');
lis1.push('<hr class="layui-border-black">')
pre4+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis1.join(''), pre4 < res.count);
});
}
});
flow.load({
@ -181,7 +239,8 @@
+result[keys[i]][0].applicantTime+'</div></div></li>');
}
lis.push("</div>")
lis.push("</div>");
lis.push('<hr class="layui-border-black">');
pre2+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
@ -221,6 +280,7 @@
}
lis.push("</div>")
lis.push('<hr class="layui-border-black">');
pre2+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
@ -337,6 +397,42 @@
});
};
openDetailForTaking = function (data) {
var index = layer.open({
title: '请求详情',
type: 2,
shade: 0.2,
maxmin: true,
shadeClose: true,
area: ['100%', '100%'],
content: '/StockTakingReview?id='+data,
end:function () {
location.reload()
}
});
$(window).on("resize", function () {
layer.full(index);
});
};
openDetailTaking = function (data) {
var index = layer.open({
title: '请求详情',
type: 2,
shade: 0.2,
maxmin: true,
shadeClose: true,
area: ['100%', '100%'],
content: '/StockTakingView?id='+data,
end:function () {
location.reload()
}
});
$(window).on("resize", function () {
layer.full(index);
});
};
//定义一个函数判断是手机端还是pc端
function isMobile(){
if(window.navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)) {

2
src/main/resources/templates/pages/material/material-view.html

@ -70,7 +70,7 @@
<input type="text" placeholder="请选择物料类型" class="layui-input" id="openSonByMateralType" readonly
th:value="${record.getMaterialType().getTname()}"
lay-verify="required"/>
<input type="text" id="materialTypeId" th:value="${record.getTypeId()}" placeholder="请选择物料类型"
<input type="text" id="materialTypeId" th:value="${record.getMaterialTypeId()}" placeholder="请选择物料类型"
name="materialTypeId" class="layui-input" style="display: none" lay-verify="required"/>
</div>
</div>

1
src/main/resources/templates/pages/material/selectMaterialByCardForTaking.html

@ -40,7 +40,6 @@
return false
}
var windowParent = $("#"+clickObj,window.parent.document)[0];
console.log(windowParent)
var children = windowParent.childNodes[5];
var materialItem = children.childNodes[3].childNodes[1].childNodes;
var materialName = materialItem[1];

350
src/main/resources/templates/pages/stockTaking/stockTakingReview.html

@ -0,0 +1,350 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>仓库盘点</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
<link rel="stylesheet" href="/static/js/lay-module/step-lay/step.css" media="all">
<style>
.inputdiv {
display: flex;
background-color: #fff;
height: 38px;
line-height: 38px;
border: 1px solid rgb(238, 238, 238);
}
.layui-form-label {
padding: 9px 0px;
text-align: left;
}
.layui-input-block {
margin-left: 80px;
}
.layui-form-select {
width: 100%;
border-style: none;
}
</style>
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto; ">
<div carousel-item style="overflow: inherit">
<div>
<fieldset class="table-search-fieldset">
<legend>库存盘点</legend>
<div class="layui-fluid">
<div class="layui-card">
<form class="layui-form"
style="margin: 0 auto;max-width: 700px;padding-top: 100px; padding-bottom: 200px"
lay-filter="form1" id="form1">
<div class="layui-card-body" id="takingHeader" style="padding-right: 0px">
<div class="layui-form-item">
<label class="layui-form-label">盘点位置:</label>
<div class="layui-input-block">
<input type="text" name="mainId" id="mainId" th:value="${mainRecord.getId()}" style="display:none;">
<input type="text" class="layui-input"
th:value="${mainRecord.getDepositoryName()}"
style="border-style: none"
id="openSonByDepository" readonly
lay-verify="required"/>
<input type="text" name="depositoryId" class="layui-input"
id="depositoryId" th:value="${mainRecord.getDepositoryId()}"
style="display: none" lay-verify="required"/>
<input type="text" name="placeId" class="layui-input" id="placeId"
th:value="${mainRecord.getPlaceId()}"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">负责人:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择负责人" class="layui-input"
id="departmentManager" readonly
th:value="${mainRecord.getDepartmentManagerName()}"
lay-verify="required"/>
<input type="text" id="departmentManagerId" name="departmentManagerId"
th:value="${mainRecord.getDepartmentManager()}"
class="layui-input" style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发起人:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择负责人" class="layui-input"
id="originatorName" readonly
th:value="${mainRecord.getOriginatorName()}"
lay-verify="required"/>
<input type="text" id="originator" name="departmentManagerId"
th:value="${mainRecord.getOriginator()}"
class="layui-input" style="display: none" lay-verify="required"/>
</div>
</div>
</div>
<fieldset class="table-search-fieldset">
<legend>盘点明细</legend>
<div class="layui-card-body" id="InventoryDetails" style="padding-right: 0px">
<hr>
<div class="layui-collapse" lay-accordion>
<div class="layui-colla-item"
th:each="recordMin,iterStar:${recordChild}">
<h2 class="layui-colla-title"
th:text="${recordMin.getMname()}"></h2>
<div class="layui-colla-content">
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input th:attr="name='code' +${recordMin.getId()},id='code'+${recordMin.getId()}"
type="text" placeholder="请填写入物料编码"
th:value="${recordMin.getMcode()}"
class="layui-input" lay-verify="required"
style="border-style: none">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<select
th:attr="id='barCode'+${recordMin.getId()},name='barCode'+${recordMin.getId()}"
style="border-style: none">
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料类型:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择物料类型"
class="layui-input"
th:value="${recordMin.getTname()}"
th:attr="id='openSonByMateralType'+${recordMin.getId()}"
readonly
lay-verify="required"/>
<input type="text"
th:value="${recordMin.getMtId()}"
th:attr="id='materialTypeId'+${recordMin.getId()},name='typeId'+${recordMin.getId()}"
placeholder="请选择物料类型" class="layui-input"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">材质:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写材质名称"
class="layui-input"
th:value="${recordMin.getMtexture()}"
th:attr="id='texture'+${recordMin.getId()},name='texture'+${recordMin.getId()}"
/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">规格型号:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写规格型号"
class="layui-input"
th:value="${recordMin.getMversion()}"
th:attr="id='version'+${recordMin.getId()},name='version'+${recordMin.getId()}"
/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">计量单位:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写计量单位"
class="layui-input"
th:value="${recordMin.getMunit()}"
th:attr="id='unit'+${recordMin.getId()},name='unit'+${recordMin.getId()}"
/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">库存数量:</label>
<div class="layui-input-block">
<input type="number" class="layui-input" readonly
th:value="${recordMin.getOldInventory()}"
th:attr="id='oldInventory'+${recordMin.getId()},name='oldInventory'+${recordMin.getId()}"
lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">盘点数量:</label>
<div class="layui-input-block">
<input type="number" class="layui-input"
th:value="${recordMin.getNewInventory()}"
th:attr="id='newInventory'+${recordMin.getId()},name='newInventory'+${recordMin.getId()}"
lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">盘点结果:</label>
<div class="layui-input-block">
<input type="text" class="layui-input" id="takingResult"
th:value="${recordMin.getTakingResultShow()}"
th:attr="id='takingResult'+${recordMin.getId()},name='takingResult'+${recordMin.getId()}"
lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">盈亏数量:</label>
<div class="layui-input-block">
<input type="number" class="layui-input" readonly
th:value="${recordMin.getInventory()}"
th:attr="id='inventory'+${recordMin.getId()},name='inventory'+${recordMin.getId()}"
lay-verify="required"/>
</div>
</div>
</div>
</div>
</div>
</div>
</fieldset>
<div id="review">
<div class="layui-form" style="margin: 0 auto;max-width: 900px;padding-top: 40px;">
<div class="layui-form-item">
<label class="layui-form-label">审核备注:</label>
<div class="layui-input-block">
<textarea id="auditOpinion" name="auditOpinion" placeholder="请填写相关原因及申请原因" value="" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button type="button" class="layui-btn" onclick="review(1)">
&emsp;审核通过&emsp;
</button>
<button type="button" class="layui-btn layui-btn-danger" onclick="review(2)">
&emsp;审核不通过&emsp;
</button>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script>
function review(data){}
layui.use(['form','step','element'], function () {
var $ = layui.$,
step = layui.step,
element = layui.element,
form = layui.form;
var position=0,states={},number = 2;
states = [ {title: "待审核"}];
// 用于分步表单加载
step.render({
elem: '#stepForm',
filter: 'stepForm',
width: '100%', //设置容器宽度
stepWidth: '750px',
height: '1495px',
position: position,
number:number,
stepItems: states
});
// 用于获取审核结果与审核的单号
review=function (pass) {
let data = {};
data.mainId = $("#mainId").val();
data.auditOpinion = $("#auditOpinion").val();
data.state = pass;
$.ajax({
url:"/stockTaking/review",
type:'post',
dataType:'json',
contentType: "application/json;charset=utf-8",
data:JSON.stringify(data),
beforeSend:function () {
this.layerIndex = layer.load(0, { shade: [0.5, '#393D49'] });
},
success:function(d){
layer.close(this.layerIndex);
if(d.status >= 300){
var errMsg = d.data.errMsg;
// 获取出错的子订单
layer.confirm("当前盘点数量中有溢出情况,需要进行转移", {
btn:["确定"]
},function () { // 继续
layer.open({
type: 2,
title: '转移物料',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['70%', '70%'],
move: '.layui-layer-title',
fixed: false,
content: '/stockTakingTransfer?minIds='+errMsg.errIds,
end: function (res) {
if(res.status >= 300){
layer.msg("提交失败,联系开发人员解决", {
icon: 5,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒)
}, function(){
window.location = '/StockTakingView?id='+data.mainId;
});
}else{
layer.msg("提交成功", {
icon: 6,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒)
}, function(){
window.location = '/StockTakingView?id='+data.mainId;
});
}
}
});
});
}
else{
layer.msg("提交成功", {
icon: 6,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒)
}, function(){
window.location = '/StockTakingView?id='+data.mainId;
});
}
},
})
};
});
</script>
</body>
</html>

291
src/main/resources/templates/pages/stockTaking/stockTakingView.html

@ -0,0 +1,291 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>仓库盘点</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
<link rel="stylesheet" href="/static/js/lay-module/step-lay/step.css" media="all">
<style>
.inputdiv {
display: flex;
background-color: #fff;
height: 38px;
line-height: 38px;
border: 1px solid rgb(238, 238, 238);
}
.layui-form-label {
padding: 9px 0px;
text-align: left;
}
.layui-input-block {
margin-left: 80px;
}
.layui-form-select {
width: 100%;
border-style: none;
}
</style>
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto; ">
<div carousel-item style="overflow: inherit">
<div>
<fieldset class="table-search-fieldset">
<legend>库存盘点</legend>
<div class="layui-fluid">
<div class="layui-card">
<form class="layui-form"
style="margin: 0 auto;max-width: 700px;padding-top: 100px; padding-bottom: 200px"
lay-filter="form1" id="form1">
<div class="layui-card-body" id="takingHeader" style="padding-right: 0px">
<div class="layui-form-item">
<label class="layui-form-label">盘点位置:</label>
<div class="layui-input-block">
<input type="text" name="mainId" th:value="${mainRecord.getId()}" style="display:none;">
<input type="text" class="layui-input"
th:value="${mainRecord.getDepositoryName()}"
style="border-style: none"
id="openSonByDepository" readonly
lay-verify="required"/>
<input type="text" name="depositoryId" class="layui-input"
id="depositoryId" th:value="${mainRecord.getDepositoryId()}"
style="display: none" lay-verify="required"/>
<input type="text" name="placeId" class="layui-input" id="placeId"
th:value="${mainRecord.getPlaceId()}"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">负责人:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择负责人" class="layui-input"
id="departmentManager" readonly
th:value="${mainRecord.getDepartmentManagerName()}"
lay-verify="required"/>
<input type="text" id="departmentManagerId" name="departmentManagerId"
th:value="${mainRecord.getDepartmentManager()}"
class="layui-input" style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发起人:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择负责人" class="layui-input"
id="originatorName" readonly
th:value="${mainRecord.getOriginatorName()}"
lay-verify="required"/>
<input type="text" id="originator" name="departmentManagerId"
th:value="${mainRecord.getOriginator()}"
class="layui-input" style="display: none" lay-verify="required"/>
</div>
</div>
</div>
<fieldset class="table-search-fieldset">
<legend>盘点明细</legend>
<div class="layui-card-body" id="InventoryDetails" style="padding-right: 0px">
<hr>
<div class="layui-collapse" lay-accordion>
<div class="layui-colla-item"
th:each="recordMin,iterStar:${recordChild}">
<h2 class="layui-colla-title"
th:text="${recordMin.getMname()}"></h2>
<div class="layui-colla-content">
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input th:attr="name='code' +${recordMin.getId()},id='code'+${recordMin.getId()}"
type="text" placeholder="请填写入物料编码"
th:value="${recordMin.getMcode()}"
class="layui-input" lay-verify="required"
style="border-style: none">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<select
th:attr="id='barCode'+${recordMin.getId()},name='barCode'+${recordMin.getId()}"
style="border-style: none">
</select>
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料类型:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择物料类型"
class="layui-input"
th:value="${recordMin.getTname()}"
th:attr="id='openSonByMateralType'+${recordMin.getId()}"
readonly
lay-verify="required"/>
<input type="text"
th:value="${recordMin.getMtId()}"
th:attr="id='materialTypeId'+${recordMin.getId()},name='typeId'+${recordMin.getId()}"
placeholder="请选择物料类型" class="layui-input"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">材质:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写材质名称"
class="layui-input"
th:value="${recordMin.getMtexture()}"
th:attr="id='texture'+${recordMin.getId()},name='texture'+${recordMin.getId()}"
/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">规格型号:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写规格型号"
class="layui-input"
th:value="${recordMin.getMversion()}"
th:attr="id='version'+${recordMin.getId()},name='version'+${recordMin.getId()}"
/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">计量单位:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写计量单位"
class="layui-input"
th:value="${recordMin.getMunit()}"
th:attr="id='unit'+${recordMin.getId()},name='unit'+${recordMin.getId()}"
/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">库存数量:</label>
<div class="layui-input-block">
<input type="number" class="layui-input" readonly
th:value="${recordMin.getOldInventory()}"
th:attr="id='oldInventory'+${recordMin.getId()},name='oldInventory'+${recordMin.getId()}"
lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">盘点数量:</label>
<div class="layui-input-block">
<input type="number" class="layui-input"
th:value="${recordMin.getNewInventory()}"
th:attr="id='newInventory'+${recordMin.getId()},name='newInventory'+${recordMin.getId()}"
lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">盘点结果:</label>
<div class="layui-input-block">
<input type="text" class="layui-input" id="takingResult"
th:value="${recordMin.getTakingResultShow()}"
th:attr="id='takingResult'+${recordMin.getId()},name='takingResult'+${recordMin.getId()}"
lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">盈亏数量:</label>
<div class="layui-input-block">
<input type="number" class="layui-input" readonly
th:value="${recordMin.getInventory()}"
th:attr="id='inventory'+${recordMin.getId()},name='inventory'+${recordMin.getId()}"
lay-verify="required"/>
</div>
</div>
</div>
</div>
</div>
</div>
</fieldset>
<div class="layui-card-body" id="takingFooter" style="padding-right: 0px;display: none">
<div class="layui-form-item">
<label class="layui-form-label">处理时间:</label>
<div class="layui-input-block">
<input type="text" id="completeTime" class="layui-input" th:value="${mainRecord.getCompleteTime()}" readonly>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">审核意见:</label>
<div class="layui-input-block">
<input type="text" placeholder="" class="layui-input"
readonly
th:value="${mainRecord.getAuditOpinion()}"
lay-verify="required"/>
</div>
</div>
</div>
</form>
</div>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script>
layui.use(['form', 'flow','step','element'], function () {
var $ = layui.$,
step = layui.step,
element = layui.element,
form = layui.form;
var position=0,states={},number = 2;
var ifShow = ($("#completeTime").val() === "");
console.log($("#completeTime").val())
console.log(ifShow)
if(ifShow){
// 如果还未处理
states = [ {title: "待审核"}];
}else{
$("#takingFooter").show();
states = [{title: "已处理"}]
}
// 用于分步表单加载
step.render({
elem: '#stepForm',
filter: 'stepForm',
width: '100%', //设置容器宽度
stepWidth: '750px',
height: '1300px',
position: position,
number:number,
stepItems: states
});
});
</script>
</body>
</html>

395
src/main/resources/templates/pages/stockTaking/stockTransfer.html

@ -0,0 +1,395 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>仓库盘点</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
<link rel="stylesheet" href="/static/js/lay-module/step-lay/step.css" media="all">
<style>
.inputdiv {
display: flex;
background-color: #fff;
height: 38px;
line-height: 38px;
border: 1px solid rgb(238, 238, 238);
}
.layui-form-label {
padding: 9px 0px;
text-align: left;
}
.layui-input-block {
margin-left: 80px;
}
.layui-form-select {
width: 100%;
border-style: none;
}
</style>
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<div>
<fieldset class="table-search-fieldset">
<legend>转移盘点</legend>
<div class="layui-fluid">
<div class="layui-card">
<form class="layui-form"
style="margin: 0 auto;max-width: 700px;padding-top: 100px; padding-bottom: 200px"
lay-filter="form1" id="form1">
<div class="layui-card-body" id="takingHeader" style="padding-right: 0px">
<div class="layui-form-item">
<label class="layui-form-label">转移位置:</label>
<div class="layui-input-block">
<input type="text" id="minIds" name="minIds" th:value="${minIds}" style="display:none;">
<input type="text" name="mainId" id="mainId" th:value="${mainRecord.getId()}"
style="display:none;">
<input type="text" class="layui-input"
id="openSonByDepository" readonly
lay-verify="required"/>
<input type="text" name="depositoryId" class="layui-input"
id="depositoryId"
style="display: none" lay-verify="required"/>
<input type="text" name="placeId" class="layui-input" id="placeId"
style="display: none" lay-verify="required"/>
</div>
</div>
</div>
<fieldset class="table-search-fieldset">
<legend>转移明细</legend>
<div class="layui-card-body" id="InventoryDetails" style="padding-right: 0px">
<hr>
<div class="layui-collapse" lay-accordion>
<div class="layui-colla-item"
th:each="recordMin,iterStar:${recordChild}">
<h2 class="layui-colla-title"
th:text="${recordMin.getMname()}"></h2>
<div class="layui-colla-content">
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input th:attr="name='code' +${recordMin.getId()},id='code'+${recordMin.getId()}"
type="text" placeholder="请填写入物料编码"
th:value="${recordMin.getMcode()}"
class="layui-input" lay-verify="required"
style="border-style: none">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<select
th:attr="id='barCode'+${recordMin.getId()},name='barCode'+${recordMin.getId()}"
style="border-style: none">
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料类型:</label>
<div class="layui-input-block">
<input type="text" placeholder="请选择物料类型"
class="layui-input"
th:value="${recordMin.getTname()}"
th:attr="id='openSonByMateralType'+${recordMin.getId()}"
readonly
lay-verify="required"/>
<input type="text"
th:value="${recordMin.getMtId()}"
th:attr="id='materialTypeId'+${recordMin.getId()},name='typeId'+${recordMin.getId()}"
placeholder="请选择物料类型" class="layui-input"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">材质:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写材质名称"
class="layui-input"
th:value="${recordMin.getMtexture()}"
th:attr="id='texture'+${recordMin.getId()},name='texture'+${recordMin.getId()}"
/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">规格型号:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写规格型号"
class="layui-input"
th:value="${recordMin.getMversion()}"
th:attr="id='version'+${recordMin.getId()},name='version'+${recordMin.getId()}"
/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">计量单位:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写计量单位"
class="layui-input"
th:value="${recordMin.getMunit()}"
th:attr="id='unit'+${recordMin.getId()},name='unit'+${recordMin.getId()}"
/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">盘点数量:</label>
<div class="layui-input-block">
<input type="number" class="layui-input"
th:value="${recordMin.getNewInventory()}"
th:attr="id='newInventory'+${recordMin.getId()},name='newInventory'+${recordMin.getId()}"
readonly
lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">转移数量:</label>
<div class="layui-input-block">
<input type="number" class="layui-input"
th:value="${recordMin.getInventory()}"
th:attr="id='invnetory'+${recordMin.getId()},name='invnetory'+${recordMin.getId()}"
onblur="checkNumber(this)"
lay-verify="required"/>
</div>
</div>
</div>
</div>
</div>
</div>
</fieldset>
<div class="layui-card-body" id="takingFooter" style="padding-right: 0px">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep">
&emsp;提交&emsp;
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script>
// 用于扫描条形码或二维码
function scanCode(obj) {
}
// 用于盘点当前转移数量是否合适
function checkNumber(obj) {
}
// 用于暂存卡片个数
let params = [];
// 用于存储当前选择的盘点位置
let depositoryId;
let placeId;
//用于存储当前最小转移量
let minTransferNum = {};
let minIds = [];
layui.use(['form', 'flow'], function () {
var $ = layui.$,
form = layui.form;
var minRecordIds = $("#minIds").val();
let split = minRecordIds.split(",");
for (let i = 0; i < split.length; i++) {
var s = split[i];
if ("" === s) {
continue;
}
minIds.push(Number(s));
minTransferNum["invnetory" + s] = ($("#invnetory" + s).val());
}
// 用于打开仓库树形菜单
$('#openSonByDepository').on('click', function () {
layer.open({
type: 2,
title: '弹窗内容',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['70%', '70%'],
move: '.layui-layer-title',
fixed: false,
content: '/selectDepository?type=2',
end: function () {
var nowDepositoryId = $("#depositoryId").val();
var nowPlaceId = $("#placeId").val();
if (nowDepositoryId !== depositoryId || nowPlaceId !== placeId) {
// 如果重新选择盘点位置
var nowDepositoryName = $("#openSonByDepository").val();
$("#form1")[0].reset();
$("#depositoryId").val(nowDepositoryId);
$("#placeId").val(nowPlaceId);
$("#openSonByDepository").val(nowDepositoryName);
form.render();
}
depositoryId = nowDepositoryId;
placeId = nowPlaceId;
}
});
});
// 用于提交盘点转移情况
form.on('submit(formStep)', function (data) {
if (depositoryId !== null && depositoryId !== undefined && depositoryId !== "") {
data = data.field;
$.ajax({
url: "/stockTaking/stockTransfer",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(data),
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (data) {
layer.msg("申请提交成功", {
icon: 6,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒)
}, function () {
step.next('#stepForm');
});
},
complete: function () {
layer.close(this.layerIndex);
}
});
} else {
layer.msg("请先选择盘点位置", {
icon: 0,
time: 500
})
}
});
//删除数组中指定元素
function remove(arr, item) {
var result = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] === item) {
continue;
}
result.push(arr[i]);
}
return result;
}
// 扫码盘点位置
scanCode = function () {
layer.open({
type: 2,
title: '弹窗内容',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'],
move: '.layui-layer-title',
fixed: false,
content: '/scanCodeByTaking',
end: function () {
var nowDepositoryId = $("#depositoryId").val();
var nowPlaceId = $("#placeId").val();
if (nowDepositoryId !== depositoryId || nowPlaceId !== placeId) {
// 如果重新选择盘点位置
var nowDepositoryName = $("#openSonByDepository").val();
$("#form1")[0].reset();
$("#depositoryId").val(nowDepositoryId);
$("#placeId").val(nowPlaceId);
$("#openSonByDepository").val(nowDepositoryName);
form.render();
}
depositoryId = nowDepositoryId;
placeId = nowPlaceId;
}
});
};
// 用于判断当前数量是否合适
checkNumber = function (obj) {
var id = obj.id;
var oldNumber = Number(minTransferNum[id]);
if (depositoryId !== null && depositoryId !== undefined && depositoryId !== "") {
var req = {};
req.depositoryId = depositoryId;
req.placeId = placeId;
$.ajax({
url: "/stockTaking/findInventoryByLocation",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(req),
success: function (d) {
var data = d.data;
var placeInventory = data.inventory;
id = id.split("invnetory")[1];
var number = Number(obj.value);
var inventory = Number($("#newInventory" + id).val());
if (number < oldNumber) {
layer.msg("转移数量不能小于" + oldNumber);
obj.value = oldNumber;
}
if (number > inventory) {
layer.msg("转移数量不能大于当前盘点数量:" + inventory);
obj.value = oldNumber;
}
if(number > placeInventory){
layer.msg("当前转移库位只能存放:" + placeInventory+"的物料");
obj.value = oldNumber;
}
}
})
} else {
layer.msg("请先选择盘点位置", {
icon: 0,
time: 500
}, function () {
obj.value = oldNumber;
})
}
}
});
</script>
</body>
</html>

11
src/test/java/com/dreamchaser/depository_manage/Test.java

@ -13,16 +13,14 @@ import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.MaterialMapper;
import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper;
import com.dreamchaser.depository_manage.pojo.MaterialP;
import com.dreamchaser.depository_manage.pojo.StockTakingChildP;
import com.dreamchaser.depository_manage.pojo.UserByPortP;
import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackBaseXml;
import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackXml_button;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard_SelectedItems;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard_button_selection;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.service.MaterialService;
import com.dreamchaser.depository_manage.service.MaterialTypeService;
import com.dreamchaser.depository_manage.service.*;
import com.dreamchaser.depository_manage.service.impl.QyWxOperationService;
import com.dreamchaser.depository_manage.utils.*;
import lombok.extern.log4j.Log4j2;
@ -69,17 +67,20 @@ import org.xml.sax.InputSource;
public class Test {
@Autowired
QyWxOperationService qyWxOperationService;
@org.junit.Test
public void test1() throws AesException, IOException, ParserConfigurationException, SAXException {
}
}

2
target/classes/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml

@ -170,7 +170,7 @@
<!-- 根据主键查询数据-->
<select id="findDepositoryRecordById" resultMap="depositoryMap" parameterType="Integer">
<select id="findDepositoryById" resultMap="depositoryMap" parameterType="Integer">
SELECT
<include refid="allColumns" />
FROM depository d WHERE d.id = #{id}

10
target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml

@ -11,7 +11,7 @@
<result column="mname" property="mname" jdbcType="VARCHAR" />
<result column="quantity" property="quantity" jdbcType="VARCHAR" />
<result column="price" property="price" jdbcType="DOUBLE" />
<result column="type_id" property="typeId" jdbcType="INTEGER" />
<result column="type_id" property="materialTypeId" jdbcType="INTEGER" />
<result column="state" property="state" jdbcType="INTEGER" />
<result column="code" property="code" jdbcType="VARCHAR"/>
<result column="version" property="version" jdbcType="VARCHAR"/>
@ -28,7 +28,7 @@
<result column="mname" property="mname" jdbcType="VARCHAR" />
<result column="quantity" property="quantity" jdbcType="VARCHAR" />
<result column="price" property="price" jdbcType="VARCHAR" />
<result column="type_id" property="typeId" jdbcType="INTEGER" />
<result column="type_id" property="materialTypeId" jdbcType="INTEGER" />
<result column="state" property="state" jdbcType="VARCHAR" />
<result column="code" property="code" jdbcType="VARCHAR"/>
<result column="version" property="version" jdbcType="VARCHAR"/>
@ -345,7 +345,7 @@
<!-- 插入数据 -->
<insert id="insertMaterial" parameterType="map" useGeneratedKeys="true" keyProperty="id">
<insert id="insertMaterial" useGeneratedKeys="true" keyProperty="id">
INSERT INTO material (
id, depository_id, mname, quantity, price, type_id,code,unit,version,texture,amounts,depositoryCode
) VALUES (
@ -467,8 +467,8 @@
<if test="price != null">
price = #{price},
</if>
<if test="typeId != null">
type_id = #{typeId},
<if test="materialTypeId != null">
type_id = #{materialTypeId},
</if>
<if test="state != null and state != ''">
state = #{state},

3
target/classes/templates/pages/application/application-in.html

@ -207,10 +207,9 @@
let scanValue = {};
// 用于卡片编号
var NewIdNumber = 1;
layui.use(['form', 'miniTab', 'step', 'flow'], function () {
layui.use(['form', 'step', 'flow'], function () {
var $ = layui.$,
form = layui.form,
miniTab = layui.miniTab,
step = layui.step;
// 用于分步表单加载

44
target/classes/templates/pages/application/my-apply.html

@ -43,6 +43,9 @@
};
function openDetailOut(data) {
};
function openDetailTaking(data){
};
layui.use(['flow', 'layer', 'flow', 'util'], function () {
var $ = layui.jquery,
@ -51,6 +54,7 @@
util = layui.util;
let size = 8;
let inpre = 0;
let takingPre = 0;
let outpre = 0;
flow.load({
elem: '#LAY_floor_in' //流加载容器
@ -81,6 +85,29 @@
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis.join(''), inpre < InCount);
});
let lis1 = [];
$.get('/stockTaking/myApply?page=' + page + '&size=' + size, function (res) {
result = res.data;
var Width = "25%";
if (isMobile()) {
Width = "50%";
}
for (let i=0;i<result.length;i++){
lis1.push('<li style="width:'+ Width +';float:left;"><div class="layui-card my-shadow my-card flow1" onclick="openDetailTaking('
+result[i].id+')"><div class="layui-card-header"><h2>'
+result[i].originatorName+'的');
lis1.push('盘点记录</h2></div>');
lis1.push('<div class="layui-col-md4 my-time" style="margin-left: 15px; color: #999;font-size: 12px;">'
+result[i].createTime+'</div></div></li>');
}
lis1.push('</div>');
lis1.push('<hr class="layui-border-black">')
takingPre+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis1.join(''), takingPre < res.count);
});
}
});
flow.load({
@ -145,6 +172,23 @@
layer.full(index);
});
};
openDetailTaking = function (data) {
var index = layer.open({
title: '请求详情',
type: 2,
shade: 0.2,
maxmin: true,
shadeClose: true,
area: ['100%', '100%'],
content: '/StockTakingView?id='+data,
end:function () {
location.reload()
}
});
$(window).on("resize", function () {
layer.full(index);
});
};
//定义一个函数判断是手机端还是pc端
function isMobile() {

106
target/classes/templates/pages/application/my-task.html

@ -78,6 +78,15 @@
// 用于手机端跳转
function openDetail4_mobile(data) {
};
//先声明(用于pc端跳转)
function openDetailForTaking(data){
}
function openDetailTaking(data){
}
layui.use(['flow', 'layer', 'table', 'util'], function () {
var $ = layui.jquery,
layer = layui.layer,
@ -86,22 +95,23 @@
util = layui.util;
//每页的数量
var size=8;
let pre1=0,pre2=0;
let pre1=0,pre2=0,pre3 = 0,pre4 = 0;
flow.load({
elem: '#LAY_floor1' //流加载容器
,scrollElem: '#LAY_floor1' //滚动条所在元素,一般不用填,此处只是演示需要。
,isAuto:false
,done: function(page, next){ //执行下一页的回调
let lis = [];
let lis1 = [];
let result;
$.get('/depositoryRecord/myTask?page='+page+'&size='+size+'&isDone=0', function(res){
var Width = "25%";
result=res.data;
lis.push("<div class='clearfix'>")
for (let i=0;i<result.length;i++){
lis.push("<div class='clearfix'>");
if(isMobile()){
Width = "50%";
}
for (let i=0;i<result.length;i++){
lis.push('<li style="width:'+ Width +';float:left;"><div class="layui-card my-shadow my-card flow1" onclick="openDetail1('
+result[i].id+')"><div class="layui-card-header"><h2>'
+result[i].applicantName+'的');
@ -110,11 +120,35 @@
+result[i].applicantTime+'</div></div></li>');
}
lis.push('</div>');
lis.push('<hr class="layui-border-black">')
pre1+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis.join(''), pre1 < res.count);
});
$.get('/stockTaking/myTask?page='+page+'&size='+size+'&isDone=0', function(res){
var Width = "25%";
result=res.data;
lis1.push("<div class='clearfix'>");
if(isMobile()){
Width = "50%";
}
for (let i=0;i<result.length;i++){
lis1.push('<li style="width:'+ Width +';float:left;"><div class="layui-card my-shadow my-card flow1" onclick="openDetailForTaking('
+result[i].id+')"><div class="layui-card-header"><h2>'
+result[i].originatorName+'的');
lis1.push('盘点记录</h2></div>');
lis1.push('<div class="layui-col-md4 my-time" style="margin-left: 15px; color: #999;font-size: 12px;">'
+result[i].createTime+'</div></div></li>');
}
lis1.push('</div>');
lis1.push('<hr class="layui-border-black">')
pre3+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis1.join(''), pre3 < res.count);
});
}
});
flow.load({
@ -123,6 +157,7 @@
,isAuto:false
,done: function(page, next){ //执行下一页的回调
let lis = [];
let lis1 = [];
let result;
$.get('/depositoryRecord/myTask?page='+page+'&size='+size+'&isDone=1', function(res){
var Width = "25%";
@ -143,12 +178,35 @@
lis.push('<div class="layui-col-md4 my-time" style="margin-left: 15px; color: #999;font-size: 12px;">'
+result[i].applicantTime+'</div></div></li>');
}
lis.push("</div>")
lis.push("</div>");
lis.push('<hr class="layui-border-black">');
pre2+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis.join(''), pre2 < res.count);
});
$.get('/stockTaking/myTask?page='+page+'&size='+size+'&isDone=1', function(res){
var Width = "25%";
result=res.data;
lis1.push("<div class='clearfix'>");
if(isMobile()){
Width = "50%";
}
for (let i=0;i<result.length;i++){
lis1.push('<li style="width:'+ Width +';float:left;"><div class="layui-card my-shadow my-card flow1" onclick="openDetailTaking('
+result[i].id+')"><div class="layui-card-header"><h2>'
+result[i].originatorName+'的');
lis1.push('盘点记录</h2></div>');
lis1.push('<div class="layui-col-md4 my-time" style="margin-left: 15px; color: #999;font-size: 12px;">'
+result[i].createTime+'</div></div></li>');
}
lis1.push('</div>');
lis1.push('<hr class="layui-border-black">')
pre4+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis1.join(''), pre4 < res.count);
});
}
});
flow.load({
@ -181,7 +239,8 @@
+result[keys[i]][0].applicantTime+'</div></div></li>');
}
lis.push("</div>")
lis.push("</div>");
lis.push('<hr class="layui-border-black">');
pre2+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
@ -221,6 +280,7 @@
}
lis.push("</div>")
lis.push('<hr class="layui-border-black">');
pre2+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
@ -337,6 +397,42 @@
});
};
openDetailForTaking = function (data) {
var index = layer.open({
title: '请求详情',
type: 2,
shade: 0.2,
maxmin: true,
shadeClose: true,
area: ['100%', '100%'],
content: '/StockTakingReview?id='+data,
end:function () {
location.reload()
}
});
$(window).on("resize", function () {
layer.full(index);
});
};
openDetailTaking = function (data) {
var index = layer.open({
title: '请求详情',
type: 2,
shade: 0.2,
maxmin: true,
shadeClose: true,
area: ['100%', '100%'],
content: '/StockTakingView?id='+data,
end:function () {
location.reload()
}
});
$(window).on("resize", function () {
layer.full(index);
});
};
//定义一个函数判断是手机端还是pc端
function isMobile(){
if(window.navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)) {

2
target/classes/templates/pages/material/material-view.html

@ -70,7 +70,7 @@
<input type="text" placeholder="请选择物料类型" class="layui-input" id="openSonByMateralType" readonly
th:value="${record.getMaterialType().getTname()}"
lay-verify="required"/>
<input type="text" id="materialTypeId" th:value="${record.getTypeId()}" placeholder="请选择物料类型"
<input type="text" id="materialTypeId" th:value="${record.getMaterialTypeId()}" placeholder="请选择物料类型"
name="materialTypeId" class="layui-input" style="display: none" lay-verify="required"/>
</div>
</div>

Loading…
Cancel
Save