Browse Source

修改库存、物料、物料类型导入方法

lwx_dev
erdanergou 3 years ago
parent
commit
b5c6329224
  1. 7
      pom.xml
  2. 2
      src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java
  3. 22
      src/main/java/com/dreamchaser/depository_manage/config/WebSocketConfig.java
  4. 10
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java
  5. 90
      src/main/java/com/dreamchaser/depository_manage/controller/ExcelController.java
  6. 4
      src/main/java/com/dreamchaser/depository_manage/controller/GroupController.java
  7. 114
      src/main/java/com/dreamchaser/depository_manage/controller/WebSocketController.java
  8. 2
      src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoForMaterial.java
  9. 6
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java
  10. 7
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  11. 4
      src/main/java/com/dreamchaser/depository_manage/scheduled/SaticScheduleTask.java
  12. 96
      src/main/java/com/dreamchaser/depository_manage/security/pool/ExcelFileInfoPool.java
  13. 21
      src/main/java/com/dreamchaser/depository_manage/service/ExcelService.java
  14. 2
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  15. 476
      src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java
  16. 8
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  17. 2
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialTypeServiceImpl.java
  18. 74
      src/main/java/com/dreamchaser/depository_manage/utils/LinkInterfaceUtil.java
  19. 530
      src/main/resources/static/js/JcPrinter/layer/layer.js
  20. 97
      src/main/resources/templates/pages/depository/table-stock.html
  21. 188
      src/main/resources/templates/pages/material/material-out.html
  22. 133
      src/main/resources/templates/pages/materialtype/materialType_view.html
  23. 8
      src/test/java/com/dreamchaser/depository_manage/TestForOther.java
  24. 7
      target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  25. 530
      target/classes/static/js/JcPrinter/layer/layer.js
  26. 188
      target/classes/templates/pages/material/material-out.html
  27. 133
      target/classes/templates/pages/materialtype/materialType_view.html

7
pom.xml

@ -26,8 +26,13 @@
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- &lt;!&ndash;跨域工具包&ndash;&gt;-->
<!-- &lt;!&ndash;跨域工具包&ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.thetransactioncompany</groupId>-->
<!-- <artifactId>cors-filter</artifactId>-->

2
src/main/java/com/dreamchaser/depository_manage/config/WebMvcConfig.java

@ -15,7 +15,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login", "/register", "/sendCode", "/error","/callback","/QyWxLogin","/getMaterialAll","/approvalcallback")
.excludePathPatterns("/webSocket/{number}","/login", "/register", "/sendCode", "/error","/callback","/QyWxLogin","/getMaterialAll","/approvalcallback")
.excludePathPatterns("classpath:/static/**")
.excludePathPatterns("/static/**");
}

22
src/main/java/com/dreamchaser/depository_manage/config/WebSocketConfig.java

@ -0,0 +1,22 @@
package com.dreamchaser.depository_manage.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* webSocket配置项
*/
@Configuration
public class WebSocketConfig {
/**
* 注入ServerEndpointExporter
* 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}

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

@ -524,7 +524,7 @@ public class DepositoryRecordController {
String crypt = Md5.crypt(header);
map.put("applicantId", userToken.getId());
// 获取当前部门负责人
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken);
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken,crypt);
StringBuilder departmentHeadId = new StringBuilder();
StringBuilder departMentHeadQyWxName = new StringBuilder();
// for (int i = 0; i < departmentHeadByUsers.size(); i++) {
@ -1019,10 +1019,10 @@ public class DepositoryRecordController {
if (token == null) {
token = (String) request.getSession().getAttribute("userToken");
}
UserByPort userToken = AuthenticationTokenPool.getUserToken(token);
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken);
String header = request.getHeader("user-agent");
String crypt = Md5.crypt(header);
UserByPort userToken = AuthenticationTokenPool.getUserToken(token);
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken,crypt);
StringBuilder departmentHeadId = new StringBuilder();
StringBuilder departMentHeadQyWxName = new StringBuilder();
// for (int i = 0; i < departmentHeadByUsers.size(); i++) {
@ -1440,7 +1440,7 @@ public class DepositoryRecordController {
} else if ("out".equals(type)) {
// 获取部门负责人
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken);
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken,crypt);
StringBuilder departmentHeadId = new StringBuilder();
StringBuilder departMentHeadQyWxName = new StringBuilder();
// for (int i = 0; i < departmentHeadByUsers.size(); i++) {
@ -1701,7 +1701,7 @@ public class DepositoryRecordController {
sumQuantity += integer;
}
// 获取部门负责人
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken);
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken,crypt);
StringBuilder departmentHeadId = new StringBuilder();
StringBuilder departMentHeadQyWxName = new StringBuilder();
// for (int i = 0; i < departmentHeadByUsers.size(); i++) {

90
src/main/java/com/dreamchaser/depository_manage/controller/ExcelController.java

@ -1,11 +1,16 @@
package com.dreamchaser.depository_manage.controller;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.pojo.RestResponse;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import com.dreamchaser.depository_manage.service.ExcelService;
import com.dreamchaser.depository_manage.utils.CrudUtil;
import com.dreamchaser.depository_manage.utils.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
@ -24,8 +29,13 @@ public class ExcelController {
* @return
*/
@PostMapping("/importExcelByMaterial")
public ResultVo importExcelByMaterial(@RequestParam("file") MultipartFile excel) {
return excelService.importExcelMaterial(excel, "material");
public ResultVo importExcelByMaterial(@RequestParam("file") MultipartFile excel, HttpServletRequest request) {
String token = request.getHeader("user-token");
if (token == null) {
token = (String) request.getSession().getAttribute("userToken");
}
UserByPort userToken = AuthenticationTokenPool.getUserToken(token);
return excelService.importExcelMaterial(excel,userToken);
}
/**
@ -35,8 +45,13 @@ public class ExcelController {
* @return
*/
@PostMapping("/importExcelByMT")
public ResultVo importExcelByMT(@RequestParam("file") MultipartFile excel) {
return excelService.importExcelMaterialType(excel);
public ResultVo importExcelByMT(@RequestParam("file") MultipartFile excel, HttpServletRequest request) {
String token = request.getHeader("user-token");
if (token == null) {
token = (String) request.getSession().getAttribute("userToken");
}
UserByPort userToken = AuthenticationTokenPool.getUserToken(token);
return excelService.importExcelMaterialType(excel,userToken);
}
@ -44,18 +59,75 @@ public class ExcelController {
* 用于库存信息的导入
*/
@PostMapping("/importInventory")
public ResultVo importInventory(@RequestParam("file") MultipartFile excel) {
return excelService.importExcelInventory(excel);
public ResultVo importInventory(@RequestParam("file") MultipartFile excel, HttpServletRequest request) {
String token = request.getHeader("user-token");
if (token == null) {
token = (String) request.getSession().getAttribute("userToken");
}
UserByPort userToken = AuthenticationTokenPool.getUserToken(token);
return excelService.importExcelInventory(excel,userToken);
}
/**
* 用于实际导入库存信息
* @param map
*/
@PostMapping("/realImportInventory")
public void realImportInventory(@RequestBody Map<String, String> map) {
public RestResponse realImportInventory(@RequestBody Map<String, String> map,HttpServletRequest request) {
String s = map.get("result");
String token = request.getHeader("user-token");
if (token == null) {
token = (String) request.getSession().getAttribute("userToken");
}
UserByPort userToken = AuthenticationTokenPool.getUserToken(token);
if ("yes".equals(s)) {
excelService.executeImportForInventory(userToken);
}else{
excelService.clearImportFileData(userToken);
}
return CrudUtil.insertHandle(1,1);
}
/**
* 用于实际导入物料类型信息
* @param map
*/
@PostMapping("/realImportMaterialType")
public RestResponse realImportMaterialType(@RequestBody Map<String, String> map,HttpServletRequest request) {
String s = map.get("result");
String token = request.getHeader("user-token");
if (token == null) {
token = (String) request.getSession().getAttribute("userToken");
}
UserByPort userToken = AuthenticationTokenPool.getUserToken(token);
if ("yes".equals(s)) {
excelService.executeImportForMaterialType(userToken);
}else{
excelService.clearImportFileData(userToken);
}
return CrudUtil.insertHandle(1,1);
}
/**
* 用于实际导入物料信息
* @param map
*/
@PostMapping("/realImportMaterial")
public RestResponse realImportMaterial(@RequestBody Map<String, String> map, HttpServletRequest request) {
String s = map.get("result");
String token = request.getHeader("user-token");
if (token == null) {
token = (String) request.getSession().getAttribute("userToken");
}
UserByPort userToken = AuthenticationTokenPool.getUserToken(token);
if ("yes".equals(s)) {
excelService.executeImportForInventory();
excelService.executeImportForMaterial(userToken);
}else{
excelService.clearImportFileData();
excelService.clearImportFileData(userToken);
}
return CrudUtil.insertHandle(1,1);
}

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

@ -607,7 +607,7 @@ public class GroupController {
String crypt = Md5.crypt(header);
map.put("applicantId", userToken.getId());
// 获取当前部门负责人
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken);
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken,crypt);
// 部门负责人id
StringBuilder departmentHeadId = new StringBuilder();
// 部门负责人企业微信user
@ -774,7 +774,7 @@ public class GroupController {
String crypt = Md5.crypt(header);
map.put("applicantId", userToken.getId());
// 获取当前部门负责人
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken);
List<UserByPort> departmentHeadByUsers = LinkInterfaceUtil.findDepartmentHeadByUser(userToken,crypt);
// 部门负责人id
StringBuilder departmentHeadId = new StringBuilder();
// 部门负责人企业微信user

114
src/main/java/com/dreamchaser/depository_manage/controller/WebSocketController.java

@ -0,0 +1,114 @@
package com.dreamchaser.depository_manage.controller;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
@Component
// 主要是将目前的类定义成一个websocket服务器端
@ServerEndpoint("/webSocket/{number}") // 接收路径
@Slf4j
public class WebSocketController {
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
//虽然@Component默认是单例模式的,但springboot还是会为每个websocket连接初始化一个bean,所以可以用一个静态set保存起来
// 。
// 注:底下WebSocket是当前类名
private static CopyOnWriteArraySet<WebSocketController> webSockets = new CopyOnWriteArraySet<>();
// 用来存在线连接用户信息
private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<String, Session>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
//接收sid
private String number = "";
/**
* 群发自定义消息
*/
public static void sendInfo(String message, @PathParam("number") String number) throws IOException {
Session session = sessionPool.get(number);
if (session != null && session.isOpen()) {
log.info("推送消息到窗口" + number + ",推送内容:" + message);
for (WebSocketController item : webSockets) {
try {
if (item.number.equals(number)) {
item.sendMessage(message);
}
} catch (IOException e) {
log.error(e.getMessage());
}
}
}
}
/**
* 链接成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("number") String number) {
try {
this.session = session;
webSockets.add(this);
sessionPool.put(number, session);
this.number = number;
System.out.println("连接成功");
log.info("【websocket消息】有新的连接,总数为:" + webSockets.size());
} catch (Exception e) {
}
}
/**
* 链接关闭调用的方法
*/
@OnClose
public void onClose() {
try {
sessionPool.remove(this.number);
webSockets.remove(this);
log.info("【websocket消息】连接断开,总数为:" + webSockets.size());
} catch (Exception e) {
}
}
/**
* 收到客户端消息后调用的方法
*
* @param message
*/
@OnMessage
public void onMessage(String message) {
log.info("【websocket消息】收到客户端消息:" + message);
}
/**
* 发送错误时的处理
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
log.error("用户错误,原因:" + error.getMessage());
error.printStackTrace();
}
/**
* 实现服务器主动推送
*/
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
}

2
src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfo.java → src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoForMaterial.java

@ -17,7 +17,7 @@ import java.math.BigInteger;
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ExcelInfo {
public class ExcelInfoForMaterial {
/** 物料编号 */
@ExcelProperty("EAS编号")

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

@ -1,7 +1,6 @@
package com.dreamchaser.depository_manage.mapper;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.pojo.MaterialP;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@ -47,7 +46,7 @@ public interface MaterialMapper {
* @param list 参数map
* @return 受影响的行数
*/
Integer insertMaterials(List<ExcelInfo> list);
Integer insertMaterials(List<ExcelInfoForMaterial> list);
/**
@ -282,6 +281,9 @@ public interface MaterialMapper {
*/
List<MaterialAndBarCode> findMaterialByBarCodeByCondition(Map<String,Object> map);
Material findMaterialByCode(String code);
/**
* 通过条件获取条形码与物料的对应关系数量
* @param map

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

@ -652,6 +652,13 @@
FROM material m WHERE m.id =#{id}
</select>
<select id="findMaterialByCode" resultMap="materialMap" parameterType="string">
SELECT
<include refid="allColumns"/>
FROM material m WHERE m.code =#{code}
</select>
<select id="findInventoryById" resultMap="InventoryMap" parameterType="integer">
SELECT
<include refid="allColumnsAndTypeNameOnViewByInventory"/>

4
src/main/java/com/dreamchaser/depository_manage/scheduled/SaticScheduleTask.java

@ -1,5 +1,6 @@
package com.dreamchaser.depository_manage.scheduled;
import com.dreamchaser.depository_manage.controller.WebSocketController;
import com.dreamchaser.depository_manage.service.MaterialService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
@ -23,4 +24,7 @@ public class SaticScheduleTask {
materialService.InitTreeMenus_Test();
}
}

96
src/main/java/com/dreamchaser/depository_manage/security/pool/ExcelFileInfoPool.java

@ -0,0 +1,96 @@
package com.dreamchaser.depository_manage.security.pool;
import com.dreamchaser.depository_manage.entity.ExcelInfoByInventory;
import com.dreamchaser.depository_manage.entity.ExcelInfoByMT;
import com.dreamchaser.depository_manage.entity.ExcelInfoForMaterial;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 用于设置用户的上传物料信息
*/
public class ExcelFileInfoPool {
private static Map<String, List<ExcelInfoByInventory>> excelVosForInventoryPool = new ConcurrentHashMap<>(1000);
private static Map<String, List<ExcelInfoByMT>> excelVosForMaterialTypePool = new ConcurrentHashMap<>(1000);
private static Map<String, List<ExcelInfoForMaterial>> excelVosForMaterialPool = new ConcurrentHashMap<>(1000);
/**
* 用于暂存当前用户的上传库存数据
* @param key 用户工号
*/
public static void addUserExcelInventoryInfo(String key, List<ExcelInfoByInventory> excelVosForInventory){
excelVosForInventoryPool.put(key, excelVosForInventory);
}
/**
* 获取当前用户上传的库存数据
* @param key
* @return
*/
public static List<ExcelInfoByInventory> getUserExcelInventoryInfo(String key){
return excelVosForInventoryPool.get(key);
}
/**
* 用于删除当前用户上传的库存数据
* @param key
*/
public static void removeUserExcelInventoryInfo(String key){
excelVosForInventoryPool.remove(key);
}
/**
* 用于暂存当前用户的上传物料数据
* @param key 用户工号
*/
public static void addUserExcelMaterialInfo(String key, List<ExcelInfoForMaterial> excelVosForMaterial){
excelVosForMaterialPool.put(key, excelVosForMaterial);
}
/**
* 获取当前用户上传的物料数据
* @param key
* @return
*/
public static List<ExcelInfoForMaterial> getUserExcelMaterialInfo(String key){
return excelVosForMaterialPool.get(key);
}
/**
* 用于删除当前用户上传的物料数据
* @param key
*/
public static void removeUserExcelMaterialInfo(String key){
excelVosForMaterialPool.remove(key);
}
/**
* 用于暂存当前用户的上传物料类型数据
* @param key 用户工号
*/
public static void addUserExcelMaterialTypeInfo(String key, List<ExcelInfoByMT> excelVosForMaterialType){
excelVosForMaterialTypePool.put(key, excelVosForMaterialType);
}
/**
* 获取当前用户上传的物料类型数据
* @param key
* @return
*/
public static List<ExcelInfoByMT> getUserExcelMaterialTypeInfo(String key){
return excelVosForMaterialTypePool.get(key);
}
/**
* 用于删除当前用户上传的物料类型数据
* @param key
*/
public static void removeUserExcelMaterialTypeInfo(String key){
excelVosForMaterialTypePool.remove(key);
}
}

21
src/main/java/com/dreamchaser/depository_manage/service/ExcelService.java

@ -13,24 +13,23 @@ public interface ExcelService {
/**
* 用于导入物料名称
* @param file
* @param excelInfo
* @return
*/
ResultVo importExcelMaterial(MultipartFile file,String excelInfo);
ResultVo importExcelMaterial(MultipartFile file,UserByPort userByPort);
/**
* 用于导入物料分类
* @param file
* @return
*/
ResultVo importExcelMaterialType(MultipartFile file);
ResultVo importExcelMaterialType(MultipartFile file,UserByPort userByPort);
/**
* 用于导入库存信息
* @param file
* @return
*/
ResultVo importExcelInventory(MultipartFile file);
ResultVo importExcelInventory(MultipartFile file,UserByPort userByPort);
/**
@ -46,12 +45,22 @@ public interface ExcelService {
/**
* 用于执行库存导入方法
*/
void executeImportForInventory();
void executeImportForInventory(UserByPort userByPort);
/**
* 用于执行物料类型导入方法
*/
void executeImportForMaterialType(UserByPort userByPort);
/**
* 用于执行物料导入方法
*/
void executeImportForMaterial(UserByPort userByPort);
/**
* 用于清空导入的数据
*/
public void clearImportFileData();
void clearImportFileData(UserByPort userByPort);
}

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

@ -27,7 +27,7 @@ public interface MaterialService {
* @param list 参数map
* @return 受影响的行数
*/
Integer insertMaterials(List<ExcelInfo> list);
Integer insertMaterials(List<ExcelInfoForMaterial> list);
/**
* 更新一条库存记录

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

@ -8,10 +8,13 @@ import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.controller.WebSocketController;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.ConstructionUnitMapper;
import com.dreamchaser.depository_manage.mapper.DepositoryRecordMapper;
import com.dreamchaser.depository_manage.mapper.MaterialMapper;
import com.dreamchaser.depository_manage.security.pool.ExcelFileInfoPool;
import com.dreamchaser.depository_manage.service.*;
import com.dreamchaser.depository_manage.utils.*;
import lombok.extern.slf4j.Slf4j;
@ -62,19 +65,14 @@ public class ExcelServiceImpl implements ExcelService {
ConstructionUnitMapper constructionUnitMapper;
List<ExcelInfoByInventory> excelVosForInventory = new ArrayList<>();
/**
* 用于导入物料名称
*
* @param file
* @param excelInfo
* @return
*/
@Override
public ResultVo importExcelMaterial(MultipartFile file, String excelInfo) {
public ResultVo importExcelMaterial(MultipartFile file, UserByPort userByPort) {
// 1.入参校验
ResultVo<String> checkExcelParam = excelutil.checkExcelParam(file);
if (!checkExcelParam.checkSuccess()) {
@ -91,51 +89,79 @@ public class ExcelServiceImpl implements ExcelService {
return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空");
}
// 3.读取excel文件
Map<String, Object> readResult = new HashMap<>();
if ("material".equals(excelInfo)) {
readResult = excelutil.simpleExcelRead(filePath, ExcelInfo.class);
}
List<ExcelInfo> excelVos = (List<ExcelInfo>) readResult.get("dataList");
Map<String, Object> readResult = excelutil.simpleExcelRead(filePath, ExcelInfoForMaterial.class);
List<ExcelInfoForMaterial> excelVosForMaterialList = (List<ExcelInfoForMaterial>) readResult.get("dataList");
List<String> errMsg = (List<String>) readResult.get("errMsg");
boolean empty = CollectionUtil.isEmpty(excelVos);
if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1)) {
List<String> dataIndex = (List<String>) readResult.get("dataIndex");
boolean empty = CollectionUtil.isEmpty(excelVosForMaterialList);
if ((CollectionUtil.isEmpty(excelVosForMaterialList) && errMsg.size() < 1) || (excelVosForMaterialList.size() < 2 && errMsg.size() < 1)) {
log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename());
return ResultVoUtil.error("上传Excel文件为空");
}
// 4.通过线程池开启一个线程去执行数据库操作,主线程继续往下执行
// 4.1开启一个线程
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
taskCenterUtil.submitTask(() -> {
List<Object> success = new ArrayList<>();
Map<String, Object> returnResult = new HashMap<>();
for (ExcelInfo excelVo : excelVos) {
Map<String, Object> param = new HashMap<>();
param.put("mname", excelVo.getMname());
param.put("code", excelVo.getCode());
param.put("unit", excelVo.getUnit());
param.put("version", excelVo.getVersion());
param.put("texture", excelVo.getTexture());
Long typeId = excelVo.getTypeId();
if (typeId != null) {
param.put("typeId", typeId);
}else{
String typeName = excelVo.getTypeName();
MaterialType materialTypeByName = materialTypeService.findMaterialTypeByName(typeName);
param.put("typeId", materialTypeByName.getOldId());
// 获取当前总数
int totalVal = excelVosForMaterialList.size();
if (totalVal > 0) {
// 初始化
ExcelFileInfoPool.addUserExcelMaterialInfo(userByPort.getNumber(), Collections.synchronizedList(new ArrayList<>()));
// 定义分页数量
double size = 100.0;
// 定义线程数
int threadSize = (int) Math.ceil(totalVal / size);
// 定义开启线程数目
int openThreadSize = 0;
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(threadSize);
// 线程结果集
List<Future<List<String>>> futureList = new ArrayList<Future<List<String>>>();
// 1.定义CompletionService
CompletionService<List<String>> completionService = new ExecutorCompletionService<>(exs);
// 定义组合id列表
List<ExcelInfoForMaterial> excelInfoForMaterialS = new ArrayList<>();
List<String> dataIndexList = new ArrayList<>();
System.out.println(excelVosForMaterialList.size());
for (int i = 0; i < excelVosForMaterialList.size(); i++) {
if (((i + 1) % 100) == 0) { // 如果有个开启线程进行处理
excelInfoForMaterialS.add(excelVosForMaterialList.get(i));
dataIndexList.add(dataIndex.get(i));
Future<List<String>> future = completionService.submit(new disposeImportMaterialFileData(excelInfoForMaterialS, dataIndexList, userByPort));
openThreadSize++;
futureList.add(future); // 添加到结果集
excelInfoForMaterialS = new ArrayList<>(); // 情况列表
dataIndexList = new ArrayList<>();
} else {
// 添加id到列表中
excelInfoForMaterialS.add(excelVosForMaterialList.get(i));
dataIndexList.add(dataIndex.get(i));
}
param.put("id", excelVo.getId());
param.put("brand", excelVo.getBrand());
param.put("price", excelVo.getPrice() == null ? "0" : excelVo.getPrice());
materialService.insertMaterial(param);
success.add(excelVo);
}
if (excelInfoForMaterialS.size() > 0) {
// 如果有剩余,开启线程进行处理
Future<List<String>> future = completionService.submit(new disposeImportMaterialFileData(excelInfoForMaterialS, dataIndexList, userByPort));
futureList.add(future);
openThreadSize++;
}
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos));
returnResult.put("success", success);
returnResult.put("errMsg", errMsg);
return ResultVoUtil.returnResultVo(200, returnResult, "结果");
});
for (int i = 0; i < openThreadSize; i++) {
List<String> strings = new ArrayList<>();
try {
strings = completionService.take().get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
errMsg.addAll(strings);
}
}
System.out.println(ExcelFileInfoPool.getUserExcelMaterialInfo(userByPort.getNumber()).size());
readResult.put("dataList", ExcelFileInfoPool.getUserExcelMaterialInfo(userByPort.getNumber()));
// 4.2删除临时文件
boolean deleteFile = FileUtil.deleteFile(new File(filePath));
if (!deleteFile) {
@ -153,7 +179,7 @@ public class ExcelServiceImpl implements ExcelService {
* @return
*/
@Override
public ResultVo importExcelMaterialType(MultipartFile file) {
public ResultVo importExcelMaterialType(MultipartFile file, UserByPort userByPort) {
// 1.入参校验
ResultVo<String> checkExcelParam = excelutil.checkExcelParam(file);
if (!checkExcelParam.checkSuccess()) {
@ -171,44 +197,81 @@ public class ExcelServiceImpl implements ExcelService {
}
// 3.读取excel文件
Map<String, Object> readResult = excelutil.simpleExcelRead(filePath, ExcelInfoByMT.class);
List<ExcelInfoByMT> excelVos = (List<ExcelInfoByMT>) readResult.get("dataList");
List<ExcelInfoByMT> excelInfoByMTList = (List<ExcelInfoByMT>) readResult.get("dataList");
List<String> errMsg = (List<String>) readResult.get("errMsg");
boolean empty = CollectionUtil.isEmpty(excelVos);
if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1)) {
List<String> dataIndex = (List<String>) readResult.get("dataIndex");
boolean empty = CollectionUtil.isEmpty(excelInfoByMTList);
if ((CollectionUtil.isEmpty(excelInfoByMTList) && errMsg.size() < 1) || (excelInfoByMTList.size() < 2 && errMsg.size() < 1)) {
log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename());
return ResultVoUtil.error("上传Excel文件为空");
}
if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1)) {
if ((CollectionUtil.isEmpty(excelInfoByMTList) && errMsg.size() < 1) || (excelInfoByMTList.size() < 2 && errMsg.size() < 1)) {
log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename());
return ResultVoUtil.error("上传Excel文件为空");
}
// 4.通过线程池开启一个线程去执行数据库操作,主线程继续往下执行
// 4.1开启一个线程
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
taskCenterUtil.submitTask(() -> {
List<Object> success = new ArrayList<>();
Map<String, Object> returnResult = new HashMap<>();
for (int i = 0; i < excelVos.size(); i++) {
Map<String, Object> insert = new HashMap<>();
ExcelInfoByMT info = excelVos.get(i);
insert.put("oldId", info.getOldId());
insert.put("tname", info.getTname());
insert.put("introduce", info.getIntroduce());
if (info.getParentId() == null) {
insert.put("materialTypeId", 0);
// 获取当前总数
int totalVal = excelInfoByMTList.size();
if (totalVal > 0) {
// 初始化
ExcelFileInfoPool.addUserExcelMaterialTypeInfo(userByPort.getNumber(), Collections.synchronizedList(new ArrayList<>()));
// 定义分页数量
double size = 100.0;
// 定义线程数
int threadSize = (int) Math.ceil(totalVal / size);
// 定义开启线程数目
int openThreadSize = 0;
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(threadSize);
// 线程结果集
List<Future<List<String>>> futureList = new ArrayList<Future<List<String>>>();
// 1.定义CompletionService
CompletionService<List<String>> completionService = new ExecutorCompletionService<>(exs);
// 定义组合id列表
List<ExcelInfoByMT> excelInfoByMTS = new ArrayList<>();
List<String> dataIndexList = new ArrayList<>();
for (int i = 0; i < excelInfoByMTList.size(); i++) {
if (((i + 1) % 100) == 0) { // 如果有10个开启线程进行处理
excelInfoByMTS.add(excelInfoByMTList.get(i));
dataIndexList.add(dataIndex.get(i));
Future<List<String>> future = completionService.submit(new disposeImportMaterialTypeFileData(excelInfoByMTS, dataIndexList, userByPort));
openThreadSize++;
futureList.add(future); // 添加到结果集
excelInfoByMTS = new ArrayList<>(); // 情况列表
dataIndexList = new ArrayList<>();
} else {
insert.put("materialTypeId", info.getParentId());
// 添加id到列表中
excelInfoByMTS.add(excelInfoByMTList.get(i));
dataIndexList.add(dataIndex.get(i));
}
}
if (excelInfoByMTS.size() > 0) {
// 如果有剩余,开启线程进行处理
Future<List<String>> future = completionService.submit(new disposeImportMaterialTypeFileData(excelInfoByMTS, dataIndexList, userByPort));
futureList.add(future);
openThreadSize++;
}
for (int i = 0; i < openThreadSize; i++) {
List<String> strings = new ArrayList<>();
try {
strings = completionService.take().get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
errMsg.addAll(strings);
}
materialTypeService.insertMaterialType(insert);
success.add(info);
}
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos));
returnResult.put("success", success);
returnResult.put("errMsg", errMsg);
return ResultVoUtil.returnResultVo(200, returnResult, "结果");
});
readResult.put("dataList", ExcelFileInfoPool.getUserExcelMaterialTypeInfo(userByPort.getNumber()));
// 4.2删除临时文件
boolean deleteFile = FileUtil.deleteFile(new File(filePath));
if (!deleteFile) {
@ -217,8 +280,6 @@ public class ExcelServiceImpl implements ExcelService {
}
log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath);
return ResultVoUtil.returnResultVo(200, readResult, "结果");
// return ResultVoUtil.success(excelVos);
}
@ -229,7 +290,7 @@ public class ExcelServiceImpl implements ExcelService {
* @return
*/
@Override
public ResultVo importExcelInventory(MultipartFile file) {
public ResultVo importExcelInventory(MultipartFile file, UserByPort userByPort) {
// 1.入参校验
ResultVo<String> checkExcelParam = excelutil.checkExcelParam(file);
if (!checkExcelParam.checkSuccess()) {
@ -263,9 +324,13 @@ public class ExcelServiceImpl implements ExcelService {
// 获取当前总数
int totalVal = excelInfoByInventories.size();
if(totalVal > 0){
if (totalVal > 0) {
// 初始化
ExcelFileInfoPool.addUserExcelInventoryInfo(userByPort.getNumber(), Collections.synchronizedList(new ArrayList<>()));
// 定义分页数量
double size = 10.0;
double size = 100.0;
// 定义线程数
int threadSize = (int) Math.ceil(totalVal / size);
@ -287,7 +352,7 @@ public class ExcelServiceImpl implements ExcelService {
if (((i + 1) % 100) == 0) { // 如果有10个开启线程进行处理
excelInfoByInventoryList.add(excelInfoByInventories.get(i));
dataIndexList.add(dataIndex.get(i));
Future<List<String>> future = completionService.submit(new disposeImportInventoryFileData(excelInfoByInventoryList,dataIndexList));
Future<List<String>> future = completionService.submit(new disposeImportInventoryFileData(excelInfoByInventoryList, dataIndexList, userByPort));
openThreadSize++;
futureList.add(future); // 添加到结果集
excelInfoByInventoryList = new ArrayList<>(); // 情况列表
@ -300,7 +365,7 @@ public class ExcelServiceImpl implements ExcelService {
}
if (excelInfoByInventoryList.size() > 0) {
// 如果有剩余,开启线程进行处理
Future<List<String>> future = completionService.submit(new disposeImportInventoryFileData(excelInfoByInventoryList,dataIndexList));
Future<List<String>> future = completionService.submit(new disposeImportInventoryFileData(excelInfoByInventoryList, dataIndexList, userByPort));
futureList.add(future);
openThreadSize++;
}
@ -317,7 +382,7 @@ public class ExcelServiceImpl implements ExcelService {
}
readResult.put("dataList", excelVosForInventory);
readResult.put("dataList", ExcelFileInfoPool.getUserExcelInventoryInfo(userByPort.getNumber()));
// 4.2删除临时文件
boolean deleteFile = FileUtil.deleteFile(new File(filePath));
@ -516,12 +581,12 @@ public class ExcelServiceImpl implements ExcelService {
/**
* 用于执行库存导入方法
*/
public void executeImportForInventory(){
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
Future<Object> objectFuture = taskCenterUtil.submitTask(() -> {
public void executeImportForInventory(UserByPort userByPort) {
List<Object> success = new ArrayList<>();
Map<String, Object> returnResult = new HashMap<>();
for (ExcelInfoByInventory excelInfoByInventory : excelVosForInventory) {
String number = userByPort.getNumber();
List<ExcelInfoByInventory> excelVosForInventory = ExcelFileInfoPool.getUserExcelInventoryInfo(number);
for (int i = 0; i < excelVosForInventory.size(); i++) {
ExcelInfoByInventory excelInfoByInventory = excelVosForInventory.get(i);
Map<String, Object> insert = new HashMap<>();
insert.put("mname", excelInfoByInventory.getMname());
insert.put("version", excelInfoByInventory.getVersion());
@ -613,28 +678,111 @@ public class ExcelServiceImpl implements ExcelService {
}
success.add(excelInfoByInventory);
if ((i + 1) % 100 == 0 || excelVosForInventory.size() - 1 == i) {
// 如果凑够100条或者已经循环完成 发送消息
try {
WebSocketController.sendInfo(JSONObject.toJSONString(success), number);
success = new ArrayList<>();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ExcelFileInfoPool.removeUserExcelInventoryInfo(number);
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForInventory));
returnResult.put("success", success);
excelVosForInventory = new ArrayList<>();
// returnResult.put("errMsg", errMsg);
return ResultVoUtil.returnResultVo(200, returnResult, "结果");
});
}
/**
* 用于执行物料类型导入方法
*/
public void executeImportForMaterialType(){
public void executeImportForMaterialType(UserByPort userByPort) {
// 4.通过线程池开启一个线程去执行数据库操作,主线程继续往下执行
// 4.1开启一个线程
List<Object> success = new ArrayList<>();
String number = userByPort.getNumber();
List<ExcelInfoByMT> excelVosForMaterialType = ExcelFileInfoPool.getUserExcelMaterialTypeInfo(number);
for (int i = 0; i < excelVosForMaterialType.size(); i++) {
ExcelInfoByMT excelInfoByMT = excelVosForMaterialType.get(i);
Map<String, Object> insert = new HashMap<>();
ExcelInfoByMT info = excelInfoByMT;
insert.put("oldId", info.getOldId());
insert.put("tname", info.getTname());
insert.put("introduce", info.getIntroduce());
if (info.getParentId() == null) {
insert.put("materialTypeId", 0);
} else {
insert.put("materialTypeId", info.getParentId());
}
materialTypeService.insertMaterialType(insert);
success.add(info);
if ((i + 1) % 100 == 0 || excelVosForMaterialType.size() - 1 == i) {
// 如果凑够100条或者已经循环完成 发送消息
try {
WebSocketController.sendInfo(JSONObject.toJSONString(success), number);
success = new ArrayList<>();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ExcelFileInfoPool.removeUserExcelMaterialTypeInfo(number);
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForMaterialType));
}
/**
* 用于执行物料导入方法
*/
public void executeImportForMaterial(UserByPort userByPort) {
List<Object> success = new ArrayList<>();
String number = userByPort.getNumber();
List<ExcelInfoForMaterial> excelVosForMaterial = ExcelFileInfoPool.getUserExcelMaterialInfo(number);
for (int i = 0; i < excelVosForMaterial.size(); i++) {
ExcelInfoForMaterial excelVo = excelVosForMaterial.get(i);
Map<String, Object> param = new HashMap<>();
param.put("mname", excelVo.getMname());
param.put("code", excelVo.getCode());
param.put("unit", excelVo.getUnit());
param.put("version", excelVo.getVersion());
param.put("texture", excelVo.getTexture());
Long typeId = excelVo.getTypeId();
if (typeId != null) {
param.put("typeId", typeId);
} else {
String typeName = excelVo.getTypeName();
MaterialType materialTypeByName = materialTypeService.findMaterialTypeByName(typeName);
param.put("typeId", materialTypeByName.getOldId());
}
param.put("id", excelVo.getId());
param.put("brand", excelVo.getBrand());
param.put("price", excelVo.getPrice() == null ? "0" : excelVo.getPrice());
materialService.insertMaterial(param);
success.add(excelVo);
if ((i + 1) % 100 == 0 || excelVosForMaterial.size() - 1 == i) {
// 如果凑够100条或者已经循环完成 发送消息
try {
WebSocketController.sendInfo(JSONObject.toJSONString(success), number);
success = new ArrayList<>();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ExcelFileInfoPool.removeUserExcelMaterialInfo(number);
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForMaterial));
}
/**
* 用于清空导入的数据
*/
public void clearImportFileData(){
excelVosForInventory = new ArrayList<>();
public void clearImportFileData(UserByPort userByPort) {
ExcelFileInfoPool.removeUserExcelInventoryInfo(userByPort.getNumber());
ExcelFileInfoPool.removeUserExcelMaterialInfo(userByPort.getNumber());
ExcelFileInfoPool.removeUserExcelMaterialTypeInfo(userByPort.getNumber());
}
@ -653,11 +801,16 @@ public class ExcelServiceImpl implements ExcelService {
*/
List<String> dataIndex;
/**
* 当前用户
*/
UserByPort userByPort;
public disposeImportInventoryFileData(List<ExcelInfoByInventory> excelInfoByInventories, List<String> dataIndex) {
public disposeImportInventoryFileData(List<ExcelInfoByInventory> excelInfoByInventories, List<String> dataIndex, UserByPort userByPort) {
this.excelInfoByInventories = excelInfoByInventories;
this.dataIndex = dataIndex;
this.userByPort = userByPort;
}
@Override
@ -722,7 +875,7 @@ public class ExcelServiceImpl implements ExcelService {
String msg = s + "出现异常:" + excelInfoByInventory.getDepositoryCode() + " 该库位无法存放当前数目的物料";
errMsg.add(msg);
} else {
excelVosForInventory.add(excelInfoByInventory);
ExcelFileInfoPool.getUserExcelInventoryInfo(userByPort.getNumber()).add(excelInfoByInventory);
pQuantity -= quantity;
placeToQuantity.put(place.getId(), pQuantity);
}
@ -734,17 +887,152 @@ public class ExcelServiceImpl implements ExcelService {
}
} else { // 否则直接加入
excelInfoByInventory.setDepositoryCode("0"); // 设置默认库位
excelVosForInventory.add(excelInfoByInventory);
ExcelFileInfoPool.getUserExcelInventoryInfo(userByPort.getNumber()).add(excelInfoByInventory);
}
}
return errMsg;
}
}
/**
* 用于处理导入的物料类型数据
*/
class disposeImportMaterialTypeFileData implements Callable<List<String>> {
/**
* 待处理数据
*/
List<ExcelInfoByMT> excelInfoByMTS;
/**
* 待处理数据对应在excel中的位置
*/
List<String> dataIndex;
/**
* 当前用户
*/
UserByPort userByPort;
public disposeImportMaterialTypeFileData(List<ExcelInfoByMT> excelInfoByMT, List<String> dataIndex, UserByPort userByPort) {
this.excelInfoByMTS = excelInfoByMT;
this.userByPort = userByPort;
this.dataIndex = dataIndex;
}
@Override
public List<String> call() throws Exception {
/**
* 定义错误信息
*/
List<String> errMsg = new ArrayList<>();
for (int i = 0; i < excelInfoByMTS.size(); i++) {
ExcelInfoByMT excelInfoByMT = excelInfoByMTS.get(i);
// 根据类型编码获取对应物料类型
MaterialType materialTypeByOldId = materialTypeService.findMaterialTypeByOldId(excelInfoByMT.getOldId());
if (materialTypeByOldId != null) {
String s = dataIndex.get(i);
errMsg.add(s + "出现异常,编码为" + excelInfoByMT.getOldId() + "已存在对应类型");
continue;
}
ExcelFileInfoPool.getUserExcelMaterialTypeInfo(userByPort.getNumber()).add(excelInfoByMT);
}
return errMsg;
}
}
/**
* 用于处理导入的物料数据
*/
class disposeImportMaterialFileData implements Callable<List<String>> {
/**
* 待处理数据
*/
List<ExcelInfoForMaterial> excelInfoByMaterialS;
/**
* 待处理数据对应在excel中的位置
*/
List<String> dataIndex;
/**
* 当前用户
*/
UserByPort userByPort;
public disposeImportMaterialFileData(List<ExcelInfoForMaterial> excelInfoByMaterialS, List<String> dataIndex, UserByPort userByPort) {
this.excelInfoByMaterialS = excelInfoByMaterialS;
this.dataIndex = dataIndex;
this.userByPort = userByPort;
}
@Override
public List<String> call() throws Exception {
/**
* 定义错误信息
*/
List<String> errMsg = new ArrayList<>();
for (int i = 0; i < excelInfoByMaterialS.size(); i++) {
ExcelInfoForMaterial excelInfoForMaterial = excelInfoByMaterialS.get(i);
Map<String, Object> paramForMaterial = new HashMap<>();
String mname = excelInfoForMaterial.getMname();
if (mname == null) {
String s = dataIndex.get(i);
String msg = s + "出现异常,未填写物料名称";
errMsg.add(msg);
continue;
}
paramForMaterial.put("mname", mname);
paramForMaterial.put("version", excelInfoForMaterial.getVersion());
Material material = materialMapper.findMaterialByMnameAndVersion(paramForMaterial);
if (material != null) {
String s = dataIndex.get(i);
String msg = s + "出现异常,名称为:" + mname + ",型号为:" + excelInfoForMaterial.getVersion() + "的物料已存在";
errMsg.add(msg);
continue;
}
if (excelInfoForMaterial.getCode() != null) {
Material materialByCode = materialMapper.findMaterialByCode(excelInfoForMaterial.getCode());
if (materialByCode != null) {
String s = dataIndex.get(i);
String msg = s + "出现异常,编码为:" + excelInfoForMaterial.getCode() + "的物料已存在";
errMsg.add(msg);
continue;
}
}
if (excelInfoForMaterial.getTypeId() == null) {
if (excelInfoForMaterial.getTypeName() == null) {
String s = dataIndex.get(i);
String msg = s + "出现异常,未填写物料类型";
errMsg.add(msg);
continue;
} else {
MaterialType materialTypeByName = materialTypeService.findMaterialTypeByName(excelInfoForMaterial.getTypeName());
if (materialTypeByName == null) {
String s = dataIndex.get(i);
String msg = s + "出现异常" + excelInfoForMaterial.getTypeName() + "的物料类型不存在";
errMsg.add(msg);
continue;
}
}
} else {
MaterialType materialTypeByOldId = materialTypeService.findMaterialTypeByOldId(excelInfoForMaterial.getTypeId());
if (materialTypeByOldId == null) {
String s = dataIndex.get(i);
String msg = s + "出现异常,类型编码为" + excelInfoForMaterial.getTypeId() + "的物料类型不存在";
errMsg.add(msg);
continue;
}
}
ExcelFileInfoPool.getUserExcelMaterialInfo(userByPort.getNumber()).add(excelInfoForMaterial);
}
return errMsg;
}
}
}

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

@ -18,7 +18,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.util.concurrent.*;
@ -108,6 +107,8 @@ public class MaterialServiceImpl implements MaterialService {
map.remove("shelfLife");
}
// 获取当前类型
Object code = map.get("code");
if(code == null){
if (map.containsKey("typeId")) {
Integer typeId = ObjectFormatUtil.toInteger(map.get("typeId").toString());
MaterialType materialTypeById = materialTypeMapper.findMaterialTypeById(typeId);
@ -122,6 +123,9 @@ public class MaterialServiceImpl implements MaterialService {
}
map.put("code",newCode);
}
}else{
map.put("materialTypeId", map.get("typeId"));
}
if (map.containsKey("barCode")) {
materialMapper.addBarCodeAndMcode(map);
}
@ -135,7 +139,7 @@ public class MaterialServiceImpl implements MaterialService {
* @return 受影响的行数
*/
@Override
public Integer insertMaterials(List<ExcelInfo> list) {
public Integer insertMaterials(List<ExcelInfoForMaterial> list) {
return materialMapper.insertMaterials(list);
}

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

@ -166,7 +166,7 @@ public class MaterialTypeServiceImpl implements MaterialTypeService {
*/
@Override
public MaterialType findMaterialTypeByName(String name) {
return null;
return materialTypeMapper.findMaterialTypeByName(name);
}
@Override

74
src/main/java/com/dreamchaser/depository_manage/utils/LinkInterfaceUtil.java

@ -3,9 +3,11 @@ package com.dreamchaser.depository_manage.utils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.config.QyWxConfig;
import com.dreamchaser.depository_manage.entity.Administration;
import com.dreamchaser.depository_manage.entity.Post;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.entity.qywxDepartment;
import com.dreamchaser.depository_manage.pojo.AdministrationP;
import com.dreamchaser.depository_manage.security.pool.AuthenticationTokenPool;
import org.apache.http.protocol.HTTP;
@ -24,6 +26,7 @@ public class LinkInterfaceUtil {
/**
* 根据条件查询用户
*
* @param map 条件
* @param userToken 当前登录用户
* @return 查询结果
@ -54,6 +57,7 @@ public class LinkInterfaceUtil {
/**
* 根据用户id查询对应用户
*
* @param id 待查讯用户id
* @param userToken 登录用户
* @return 查询结果
@ -78,6 +82,7 @@ public class LinkInterfaceUtil {
/**
* 根据id查询对应的行政组织
*
* @param id 待查讯组织id
* @param userByPort 登录用户
* @return 查询结果
@ -102,6 +107,7 @@ public class LinkInterfaceUtil {
/**
* 根据上级查询对应的行政组织
*
* @param superior 上级编号
* @param userByPort 登录用户
* @return 查询结果
@ -110,8 +116,8 @@ public class LinkInterfaceUtil {
String url = PortConfig.external_url + "/org/govlist";
Map<String, Object> map = new HashMap<>();
map.put("superior", superior);
map.put("level",4);
map.put("state",1);
map.put("level", 4);
map.put("state", 1);
String jsonString = JSONObject.toJSONString(map);
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
@ -138,6 +144,7 @@ public class LinkInterfaceUtil {
/**
* 根据岗位id查询对应的岗位信息
*
* @param id 岗位id
* @param userByPort 登录用户
* @return 查询结果
@ -163,12 +170,13 @@ public class LinkInterfaceUtil {
/**
* 获取对应的验证码信息
*
* @param request 请求体
* @return 结果
*/
public static JSONObject Captcha(HttpServletRequest request) {
String token = request.getHeader("user-token");
if(token == null){
if (token == null) {
token = (String) request.getSession().getAttribute("userToken");
}
UserByPort userByPort = AuthenticationTokenPool.getUserToken(token);
@ -187,6 +195,7 @@ public class LinkInterfaceUtil {
/**
* 获取当前行政组织列表
*
* @return
*/
public static Map<String, Object> findAdministration(UserByPort userByPort) {
@ -195,7 +204,7 @@ public class LinkInterfaceUtil {
String superior = "313";
map.put("superior", superior);
map.put("state", 1);
map.put("level",3);
map.put("level", 3);
String jsonString = JSONObject.toJSONString(map);
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
@ -225,43 +234,37 @@ public class LinkInterfaceUtil {
/**
* 获取当前登录用户的部门负责人
*
* @param user
* @return
*/
public static List<UserByPort> findDepartmentHeadByUser(UserByPort user){
public static List<UserByPort> findDepartmentHeadByUser(UserByPort user, String userAgent) {
List<UserByPort> DepartmentHeads = new ArrayList<>();
if(Integer.compare(user.getId(),119) == 0){
if (Integer.compare(user.getId(), 119) == 0) {
// 如果申请人id为106
DepartmentHeads.add(user);
return DepartmentHeads;
}
if(Integer.compare(user.getMaindeparment(),361) == 0){
if (Integer.compare(user.getMaindeparment(), 361) == 0) {
// 如果申请人部门为仓储
UserByPort userByPort = FindUserById(119, user);
DepartmentHeads.add(userByPort);
return DepartmentHeads;
}
String url = PortConfig.external_url + "/staff/archiveslist";
Integer maindeparment = user.getMaindeparment();
Map<String,Object> map = new HashMap<>();
map.put("adminorg",maindeparment);
String jsonString = JSONObject.toJSONString(map);
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
post = HttpUtils.send(url, paramObject, HTTP.UTF_8,user);
} 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();
}
for (Object o : list) {
UserByPort userByPort = JSONObject.toJavaObject((JSONObject) o, UserByPort.class);
if (userByPort.getPersonincharge() == 1) {
// 获取当前登录用户部门与企业微信部门对照
JSONObject userPortByQyWx = PortConfig.getUserPortByQyWx(user.getMaindeparment());
String portName = userPortByQyWx.getString("name");
Integer portByQyWxInteger = userPortByQyWx.getInteger("wechatorganizationid");
qywxDepartment qyWxDepartment = QyWxConfig.getQyWxDepartment(userAgent, portByQyWxInteger);
// 获取部门负责人id列表
List<String> userIdList = new ArrayList<>(qyWxDepartment.getDepartment_leader());
for (String userId : userIdList
) {
Map<String, Object> portInfo = PortConfig.findUserByQyWxUserId(userId);
UserByPort userByPort = (UserByPort) portInfo.get("user");
if (userByPort != null) {
DepartmentHeads.add(userByPort);
}
}
@ -271,21 +274,22 @@ public class LinkInterfaceUtil {
/**
* 用于获取行政组织树
*
* @param userByPort
* @return
*/
public static JSONArray getPostTree(UserByPort userByPort){
public static JSONArray getPostTree(UserByPort userByPort) {
String url = PortConfig.external_url + "/org/govthreeing";
Map<String,Object> param = new HashMap<>();
param.put("id",userByPort.getCompany());
param.put("idstr","");
param.put("level",0);
param.put("all",1);
Map<String, Object> param = new HashMap<>();
param.put("id", userByPort.getCompany());
param.put("idstr", "");
param.put("level", 0);
param.put("all", 1);
String jsonString = JSONObject.toJSONString(param);
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
post = HttpUtils.send(url, paramObject, HTTP.UTF_8,userByPort);
post = HttpUtils.send(url, paramObject, HTTP.UTF_8, userByPort);
} catch (IOException e) {
e.printStackTrace();
}

530
src/main/resources/static/js/JcPrinter/layer/layer.js

File diff suppressed because one or more lines are too long

97
src/main/resources/templates/pages/depository/table-stock.html

@ -83,6 +83,13 @@
</button>
</script>
<div id="showImportData"
style="height: 500px;width: 500px;position: absolute;overflow: auto;top: 10%;left: 25%;background: #ffffff;z-index: 1231234;display: none">
<div onclick="closeShowDataMessage()" style="position: absolute; right: 0; top: 2%; cursor: pointer;">
<i class="fa fa-window-close-o"></i>
</div>
</div>
</div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
@ -99,6 +106,16 @@
}
function closeShowDataMessage() {
}
let socket;
let newIndexShade;
layui.use(['form', 'table', 'upload'], function () {
var $ = layui.jquery,
form = layui.form,
@ -483,7 +500,32 @@
re += show
}
layer.open({
if ("WebSocket" in window) {
socket = new WebSocket('ws://127.0.0.1:11111/webSocket/300450');
switch (socket.readyState) {
case WebSocket.CONNECTING:
// 连接中
socket.onopen = function () {
console.log("连接成功")
};
break;
case WebSocket.OPEN:
// 连接成功
break;
case WebSocket.CLOSING:
// 连接正在关闭。
break;
case WebSocket.CLOSED:
// 连接关闭。
break;
default:
// this never happens
break;
}
}
newIndexShade = layer.open({
type: 1
, title: false //不显示标题栏
, closeBtn: false
@ -502,9 +544,18 @@
type: "post",
data: JSON.stringify({"result":"yes"}),
dataType: "json",
contentType: "application/json;charset=utf-8"
contentType: "application/json;charset=utf-8",
success: function () {
if (socket !== null) {
socket.close();
}
layer.msg("数据导入完成", {
icon: 0,
time: 1000
})
}
});
layer.close(index);//关闭当前页
}
, btn2: function (index, layero) {
@ -514,10 +565,17 @@
type: "post",
data: JSON.stringify({"result":"no"}),
dataType: "json",
contentType: "application/json;charset=utf-8"
contentType: "application/json;charset=utf-8",
success: function () {
if (socket !== null) {
socket.close();
}
}
})
}
});
} else {
layer.msg(res.msg)
}
@ -534,6 +592,37 @@
})
}
socket.addEventListener('message', function (event) {
layer.close(newIndexShade);
let shadeItem = '<div class="layui-layer-shade" id='+"layui-layer-shade-x"+newIndexShade+' times="753951" style="z-index:1231233; background-color: rgb(0, 0, 0); opacity: 0.8;"></div>';
if ($("#"+"layui-layer-shade-x"+newIndexShade).length <= 0) {
$('body').append(shadeItem);
}
let jsonObject = JSON.parse(event.data);
let re = "";
$("#showImportData").show();
for (let i = 0; i < jsonObject.length; i++) {
var code = jsonObject[i]["code"] === null ? '' : jsonObject[i]["code"];
var mname = jsonObject[i]["mname"];
var version = jsonObject[i]["version"] === null ? '' : jsonObject[i]["version"];
var quantity = jsonObject[i]["quantity"];
var show = "<p style='color: #00FF00'>" + code + ", " + mname + ", " + version + ", 数量为" + quantity + ":通过" + "</p>";
re += show
}
$("#showImportData").append(re);
});
closeShowDataMessage = function () {
$("#layui-layer-shade-x"+newIndexShade).remove();
$("#showImportData").hide();
$("#showImportData").empty();
if (socket !== null) {
socket.close();
}
};
});
</script>

188
src/main/resources/templates/pages/material/material-out.html

@ -8,6 +8,7 @@
<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/lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
</head>
<body>
@ -17,9 +18,9 @@
<input style="display:none;" id="nowDay" th:value="${nowDay}">
<input style="display:none;" id="display" th:value="${display}">
<fieldset class="table-search-fieldset" >
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px" >
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="">
<div class="layui-form-item">
@ -36,19 +37,22 @@
<div class="layui-inline">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-block">
<input type="text" name="mname" autocomplete="off" class="layui-input" placeholder="请输入物料名称">
<input type="text" name="mname" autocomplete="off" class="layui-input"
placeholder="请输入物料名称">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">型号</label>
<div class="layui-input-block">
<input type="text" class="layui-input" id="version" name="version" autocomplete="off" placeholder="请输入物料型号"/>
<input type="text" class="layui-input" id="version" name="version" autocomplete="off"
placeholder="请输入物料型号"/>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">物料编码</label>
<div class="layui-input-block">
<input type="text" name="code" autocomplete="off" class="layui-input" placeholder="请输入物料编码">
<input type="text" name="code" autocomplete="off" class="layui-input"
placeholder="请输入物料编码">
</div>
</div>
<div class="layui-inline">
@ -68,11 +72,10 @@
</div>
</div>
</form>
</div >
</div>
</fieldset>
<!-- 状态展示-->
<script type="text/html" id="switchTpl">
<input type="checkbox" name="state" value="{{d.id}}" lay-skin="switch" lay-text="核准|禁用"
@ -82,7 +85,9 @@
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"> 添加</button>
<button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete" th:style="'display:'+${display}"> 删除</button>
<button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete"
th:style="'display:'+${display}"> 删除
</button>
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="applicationIn"> 入库申请
</button>
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" id="u_fileUpload"
@ -99,20 +104,38 @@
</script>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="detail">详情</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" th:style="'display:'+${display}" lay-event="delete">删除</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" th:style="'display:'+${display}"
lay-event="delete">删除</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" th:style="'display:'+${display}"
lay-event="realDelete">彻底删除</a>
</script>
<div id="showImportData"
style="height: 500px;width: 500px;position: absolute;overflow: auto;top: 10%;left: 25%;background: #ffffff;z-index: 1231234;display: none">
<div onclick="closeShowDataMessage()" style="position: absolute; right: 0; top: 2%; cursor: pointer;">
<i class="fa fa-window-close-o"></i>
</div>
</div>
</div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
function bindTableToolbarFunction(){
function bindTableToolbarFunction() {
}
function showDetail() {
}
function showDetail(){
function closeShowDataMessage() {
}
let socket;
let newIndexShade;
layui.use(['form', 'table', 'upload'], function () {
var $ = layui.jquery,
form = layui.form,
@ -130,12 +153,12 @@
move: '.layui-layer-title',
fixed: false,
content: '/selectType',
success: function(layero, index){
success: function (layero, index) {
var children = layero.children();
var content = $(children[1]);
var iframeChildren = $(content.children());
content.css('height','100%');
iframeChildren.css('height','100%');
content.css('height', '100%');
iframeChildren.css('height', '100%');
}
});
});
@ -205,18 +228,18 @@
]
],
limits: [10, 15, 20, 25, 50,100],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: true,
skin: 'line',
done: function (res, curr, count) {
let display = $("#display").val();
if("inline-block" === display){
if(flagForRelod){
if ("inline-block" === display) {
if (flagForRelod) {
flagForRelod = false;
let col = {field: 'price', width: 150, title: '物料单价'};
cols.splice(6,0,col);
table.reload('currentTableId',{cols:[cols]});
cols.splice(6, 0, col);
table.reload('currentTableId', {cols: [cols]});
bindTableToolbarFunction();
}
@ -255,16 +278,85 @@
var texture = res.data.dataList[i]["texture"] == null || res.data.dataList[i]["texture"] === undefined ? "" : res.data.dataList[i]["texture"];
var unit = res.data.dataList[i]["unit"] == null || res.data.dataList[i]["unit"] === undefined ? "" : res.data.dataList[i]["unit"];
var typeId = res.data.dataList[i]["typeId"] == null || res.data.dataList[i]["typeId"] === undefined ? "" : res.data.dataList[i]["typeId"];
var show = "<p style='color: #00FF00'>" + mname + " " + version + " " + code + " " + texture + " " + unit + " " + typeId + " :成功" + "</p>";
var show = "<p style='color: #00FF00'>" + mname + " " + version + " " + code + " " + texture + " " + unit + " " + typeId + " :通过" + "</p>";
re += show
}
layer.open({
type: 1,
skin: 'layui-layer-rim', //加上边框
area: ['500px', '500px'], //宽高
content: re
if ("WebSocket" in window) {
socket = new WebSocket('ws://127.0.0.1:11111/webSocket/300450');
switch (socket.readyState) {
case WebSocket.CONNECTING:
// 连接中
socket.onopen = function () {
console.log("连接成功")
};
break;
case WebSocket.OPEN:
// 连接成功
break;
case WebSocket.CLOSING:
// 连接正在关闭。
break;
case WebSocket.CLOSED:
// 连接关闭。
break;
default:
// this never happens
break;
}
}
newIndexShade = layer.open({
type: 1
, title: false //不显示标题栏
, closeBtn: false
, area: ['500px', '500px']
, shade: 0.8
, id: 'LAY_layuipro' //设定一个id,防止重复弹出
, resize: false
, btn: ['导入', '取消']
, btnAlign: 'c'
, moveType: 1 //拖拽模式,0或者1
, content: re
, yes: function (index, layero) {
//按钮【按钮一】的回调
$.ajax({
url: "/excel/realImportMaterial",
type: "post",
data: JSON.stringify({"result": "yes"}),
dataType: "json",
contentType: "application/json;charset=utf-8",
success: function () {
if (socket !== null) {
socket.close();
}
layer.msg("数据导入完成", {
icon: 0,
time: 1000
})
}
});
}
, btn2: function (index, layero) {
//按钮【按钮二】的回调
$.ajax({
url: "/excel/realImportMaterial",
type: "post",
data: JSON.stringify({"result": "no"}),
dataType: "json",
contentType: "application/json;charset=utf-8",
success: function () {
if (socket !== null) {
socket.close();
}
}
})
}
});
} else {
layer.msg(res.msg)
}
@ -281,6 +373,38 @@
});
}
socket.addEventListener('message', function (event) {
layer.close(newIndexShade);
let shadeItem = '<div class="layui-layer-shade" id='+"layui-layer-shade-x"+newIndexShade+' times="753951" style="z-index:1231233; background-color: rgb(0, 0, 0); opacity: 0.8;"></div>';
if ($("#"+"layui-layer-shade-x"+newIndexShade).length <= 0) {
$('body').append(shadeItem);
}
let jsonObject = JSON.parse(event.data);
let re = "";
$("#showImportData").show();
for (let i = 0; i < jsonObject.length; i++) {
var mname = jsonObject[i]["mname"];
var code = jsonObject[i]["code"] == null || jsonObject[i]["code"] === undefined ? "" : jsonObject[i]["code"];
var version = jsonObject[i]["version"] == null || jsonObject[i]["version"] === undefined ? "" : jsonObject[i]["version"];
var texture = jsonObject[i]["texture"] == null || jsonObject[i]["texture"] === undefined ? "" : jsonObject[i]["texture"];
var unit = jsonObject[i]["unit"] == null || jsonObject[i]["unit"] === undefined ? "" : jsonObject[i]["unit"];
var typeId = jsonObject[i]["typeId"] == null || jsonObject[i]["typeId"] === undefined ? "" : jsonObject[i]["typeId"];
var show = "<p style='color: #00FF00'>" + mname + " " + version + " " + code + " " + texture + " " + unit + " " + typeId + " :成功" + "</p>";
re += show;
}
$("#showImportData").append(re);
});
closeShowDataMessage = function () {
$("#layui-layer-shade-x"+newIndexShade).remove();
$("#showImportData").hide();
$("#showImportData").empty();
if (socket !== null) {
socket.close();
}
};
// 监听搜索操作
@ -332,8 +456,7 @@
$(window).on("resize", function () {
layer.full(index);
});
}
else if (obj.event === 'delete') { // 监听删除操作
} else if (obj.event === 'delete') { // 监听删除操作
var checkStatus = table.checkStatus('currentTableId')
, data = checkStatus.data;
var req = {};
@ -378,8 +501,7 @@
layer.msg("未选中记录,请确认!");
return false;
}
}
else if (obj.event === 'applicationIn') {
} else if (obj.event === 'applicationIn') {
// 入库申请
var checkStatus = table.checkStatus('currentTableId')
, data = checkStatus.data;
@ -400,7 +522,7 @@
},
success: function (d) {
layer.close(this.layerIndex);
if (d.status == 200) {
if (d.status === 200) {
layer.open({
type: 2,
title: '入库',
@ -420,14 +542,12 @@
}
})
}
else if (obj.event === 'downloadFile') {
window.open("/download/materialImportDownload","_self");
} else if (obj.event === 'downloadFile') {
window.open("/download/materialImportDownload", "_self");
}
});
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {
console.log(obj)

133
src/main/resources/templates/pages/materialtype/materialType_view.html

@ -85,6 +85,13 @@
lay-event="realDelete">彻底删除</a>
</script>
<div id="showImportData"
style="height: 500px;width: 500px;position: absolute;overflow: auto;top: 10%;left: 25%;background: #ffffff;z-index: 1231234;display: none">
<div onclick="closeShowDataMessage()" style="position: absolute; right: 0; top: 2%; cursor: pointer;">
<i class="fa fa-window-close-o"></i>
</div>
</div>
</div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
@ -92,6 +99,17 @@
function bindTableToolbarFunction(){
}
function closeShowDataMessage() {
}
let socket;
let newIndexShade;
layui.use(['form', 'table', 'upload'], function () {
var $ = layui.jquery,
form = layui.form,
@ -245,27 +263,98 @@
exts: 'xls|xlsx|csv',
done: function (res) {
//如果上传成功
if (res.code == 200) {
if (res.code === 200) {
var re = "";
for (let i = 0; i < res.data.errMsg.length; i++) {
var show = "<p style='color: #ff211e'>" + res.data.errMsg[i] + ":错误" + "</p>";
re += show
}
console.log(res.data.dataList.length);
for (let i = 0; i < res.data.dataList.length; i++) {
var tname = res.data.dataList[i]["tname"];
var id = res.data.dataList[i]["oldId"];
var parentId = res.data.dataList[i]["parentId"] == null ? "" : res.data.dataList[i]["parentId"];
var introduce = res.data.dataList[i]["introduce"] == null ? "" : res.data.dataList[i]["introduce"];
var show = "<p style='color: #00FF00'>" + tname + " " + id + " " + parentId + "成功" + "</p>";
var show = "<p style='color: #00FF00'>" + tname + " " + id + " " + parentId + "通过" + "</p>";
re += show
}
layer.open({
type: 1,
skin: 'layui-layer-rim', //加上边框
area: ['500px', '500px'], //宽高
content: re
if ("WebSocket" in window) {
socket = new WebSocket('ws://127.0.0.1:11111/webSocket/300450');
switch (socket.readyState) {
case WebSocket.CONNECTING:
// 连接中
socket.onopen = function () {
console.log("连接成功")
};
break;
case WebSocket.OPEN:
// 连接成功
break;
case WebSocket.CLOSING:
// 连接正在关闭。
break;
case WebSocket.CLOSED:
// 连接关闭。
break;
default:
// this never happens
break;
}
}
newIndexShade = layer.open({
type: 1
, title: false //不显示标题栏
, closeBtn: false
, area: ['500px', '500px']
, shade: 0.8
, id: 'LAY_layuipro' //设定一个id,防止重复弹出
, resize: false
, btn: ['导入', '取消']
, btnAlign: 'c'
, moveType: 1 //拖拽模式,0或者1
, content: re
, yes: function (index, layero) {
//按钮【按钮一】的回调
$.ajax({
url:"/excel/realImportMaterialType",
type: "post",
data: JSON.stringify({"result":"yes"}),
dataType: "json",
contentType: "application/json;charset=utf-8",
success:function () {
if (socket !== null) {
socket.close();
}
layer.msg("数据导入完成", {
icon: 0,
time: 1000
})
}
});
}
, btn2: function (index, layero) {
//按钮【按钮二】的回调
$.ajax({
url:"/excel/realImportMaterialType",
type: "post",
data: JSON.stringify({"result":"no"}),
dataType: "json",
contentType: "application/json;charset=utf-8",
success: function () {
if (socket !== null) {
socket.close();
}
}
})
}
});
} else {
layer.msg(res.msg)
}
@ -281,6 +370,36 @@
});
}
socket.addEventListener('message', function (event) {
layer.close(newIndexShade);
let shadeItem = '<div class="layui-layer-shade" id='+"layui-layer-shade-x"+newIndexShade+' times="753951" style="z-index:1231233; background-color: rgb(0, 0, 0); opacity: 0.8;"></div>';
if ($("#"+"layui-layer-shade-x"+newIndexShade).length <= 0) {
$('body').append(shadeItem);
}
let jsonObject = JSON.parse(event.data);
let re = "";
$("#showImportData").show();
for (let i = 0; i < jsonObject.length; i++) {
var tname = jsonObject[i]["tname"];
var id = jsonObject[i]["oldId"];
var parentId = jsonObject[i]["parentId"] == null ? "" : jsonObject[i]["parentId"];
var introduce = jsonObject[i]["introduce"] == null ? "" : jsonObject[i]["introduce"];
var show = "<p style='color: #00FF00'>" + tname + " " + id + " " + parentId + "成功" + "</p>";
re += show
}
$("#showImportData").append(re);
});
closeShowDataMessage = function () {
$("#layui-layer-shade-x"+newIndexShade).remove();
$("#showImportData").hide();
$("#showImportData").empty();
if (socket !== null) {
socket.close();
}
};
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {

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

@ -65,9 +65,15 @@ public class TestForOther {
// approvalInfo.setApprover(approver);
// depositoryRecordService.reviewByQyWxApprovalOut("1",approvalInfo,"599076aa8e931b27af7935eb69db4243","2","202303290034", false,2);
// depositoryRecordService.reviewByQyWxApprovalIn("[1]",approvalInfo,"460f46eaefb46bb0c171029f62e2cea6","2","202303220009");
// UserByPort userByPort = LinkInterfaceUtil.FindUserById(78, null);
UserByPort userByPort = LinkInterfaceUtil.FindUserById(76, null);
// List<String> s = excelService.writeExcelForPrint(2, 4,userByPort);
// GetMonthStartAndEnd();
// List<UserByPort> departmentHeadByUser = LinkInterfaceUtil.findDepartmentHeadByUser(userByPort);
// System.out.println(departmentHeadByUser);
System.out.println(userByPort);
List<String> a = new ArrayList<>();
List<String> list = Collections.synchronizedList(a);
}

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

@ -652,6 +652,13 @@
FROM material m WHERE m.id =#{id}
</select>
<select id="findMaterialByCode" resultMap="materialMap" parameterType="string">
SELECT
<include refid="allColumns"/>
FROM material m WHERE m.code =#{code}
</select>
<select id="findInventoryById" resultMap="InventoryMap" parameterType="integer">
SELECT
<include refid="allColumnsAndTypeNameOnViewByInventory"/>

530
target/classes/static/js/JcPrinter/layer/layer.js

File diff suppressed because one or more lines are too long

188
target/classes/templates/pages/material/material-out.html

@ -8,6 +8,7 @@
<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/lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
</head>
<body>
@ -17,9 +18,9 @@
<input style="display:none;" id="nowDay" th:value="${nowDay}">
<input style="display:none;" id="display" th:value="${display}">
<fieldset class="table-search-fieldset" >
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px" >
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="">
<div class="layui-form-item">
@ -36,19 +37,22 @@
<div class="layui-inline">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-block">
<input type="text" name="mname" autocomplete="off" class="layui-input" placeholder="请输入物料名称">
<input type="text" name="mname" autocomplete="off" class="layui-input"
placeholder="请输入物料名称">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">型号</label>
<div class="layui-input-block">
<input type="text" class="layui-input" id="version" name="version" autocomplete="off" placeholder="请输入物料型号"/>
<input type="text" class="layui-input" id="version" name="version" autocomplete="off"
placeholder="请输入物料型号"/>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">物料编码</label>
<div class="layui-input-block">
<input type="text" name="code" autocomplete="off" class="layui-input" placeholder="请输入物料编码">
<input type="text" name="code" autocomplete="off" class="layui-input"
placeholder="请输入物料编码">
</div>
</div>
<div class="layui-inline">
@ -68,11 +72,10 @@
</div>
</div>
</form>
</div >
</div>
</fieldset>
<!-- 状态展示-->
<script type="text/html" id="switchTpl">
<input type="checkbox" name="state" value="{{d.id}}" lay-skin="switch" lay-text="核准|禁用"
@ -82,7 +85,9 @@
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"> 添加</button>
<button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete" th:style="'display:'+${display}"> 删除</button>
<button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete"
th:style="'display:'+${display}"> 删除
</button>
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="applicationIn"> 入库申请
</button>
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" id="u_fileUpload"
@ -99,20 +104,38 @@
</script>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="detail">详情</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" th:style="'display:'+${display}" lay-event="delete">删除</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" th:style="'display:'+${display}"
lay-event="delete">删除</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" th:style="'display:'+${display}"
lay-event="realDelete">彻底删除</a>
</script>
<div id="showImportData"
style="height: 500px;width: 500px;position: absolute;overflow: auto;top: 10%;left: 25%;background: #ffffff;z-index: 1231234;display: none">
<div onclick="closeShowDataMessage()" style="position: absolute; right: 0; top: 2%; cursor: pointer;">
<i class="fa fa-window-close-o"></i>
</div>
</div>
</div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
function bindTableToolbarFunction(){
function bindTableToolbarFunction() {
}
function showDetail() {
}
function showDetail(){
function closeShowDataMessage() {
}
let socket;
let newIndexShade;
layui.use(['form', 'table', 'upload'], function () {
var $ = layui.jquery,
form = layui.form,
@ -130,12 +153,12 @@
move: '.layui-layer-title',
fixed: false,
content: '/selectType',
success: function(layero, index){
success: function (layero, index) {
var children = layero.children();
var content = $(children[1]);
var iframeChildren = $(content.children());
content.css('height','100%');
iframeChildren.css('height','100%');
content.css('height', '100%');
iframeChildren.css('height', '100%');
}
});
});
@ -205,18 +228,18 @@
]
],
limits: [10, 15, 20, 25, 50,100],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: true,
skin: 'line',
done: function (res, curr, count) {
let display = $("#display").val();
if("inline-block" === display){
if(flagForRelod){
if ("inline-block" === display) {
if (flagForRelod) {
flagForRelod = false;
let col = {field: 'price', width: 150, title: '物料单价'};
cols.splice(6,0,col);
table.reload('currentTableId',{cols:[cols]});
cols.splice(6, 0, col);
table.reload('currentTableId', {cols: [cols]});
bindTableToolbarFunction();
}
@ -255,16 +278,85 @@
var texture = res.data.dataList[i]["texture"] == null || res.data.dataList[i]["texture"] === undefined ? "" : res.data.dataList[i]["texture"];
var unit = res.data.dataList[i]["unit"] == null || res.data.dataList[i]["unit"] === undefined ? "" : res.data.dataList[i]["unit"];
var typeId = res.data.dataList[i]["typeId"] == null || res.data.dataList[i]["typeId"] === undefined ? "" : res.data.dataList[i]["typeId"];
var show = "<p style='color: #00FF00'>" + mname + " " + version + " " + code + " " + texture + " " + unit + " " + typeId + " :成功" + "</p>";
var show = "<p style='color: #00FF00'>" + mname + " " + version + " " + code + " " + texture + " " + unit + " " + typeId + " :通过" + "</p>";
re += show
}
layer.open({
type: 1,
skin: 'layui-layer-rim', //加上边框
area: ['500px', '500px'], //宽高
content: re
if ("WebSocket" in window) {
socket = new WebSocket('ws://127.0.0.1:11111/webSocket/300450');
switch (socket.readyState) {
case WebSocket.CONNECTING:
// 连接中
socket.onopen = function () {
console.log("连接成功")
};
break;
case WebSocket.OPEN:
// 连接成功
break;
case WebSocket.CLOSING:
// 连接正在关闭。
break;
case WebSocket.CLOSED:
// 连接关闭。
break;
default:
// this never happens
break;
}
}
newIndexShade = layer.open({
type: 1
, title: false //不显示标题栏
, closeBtn: false
, area: ['500px', '500px']
, shade: 0.8
, id: 'LAY_layuipro' //设定一个id,防止重复弹出
, resize: false
, btn: ['导入', '取消']
, btnAlign: 'c'
, moveType: 1 //拖拽模式,0或者1
, content: re
, yes: function (index, layero) {
//按钮【按钮一】的回调
$.ajax({
url: "/excel/realImportMaterial",
type: "post",
data: JSON.stringify({"result": "yes"}),
dataType: "json",
contentType: "application/json;charset=utf-8",
success: function () {
if (socket !== null) {
socket.close();
}
layer.msg("数据导入完成", {
icon: 0,
time: 1000
})
}
});
}
, btn2: function (index, layero) {
//按钮【按钮二】的回调
$.ajax({
url: "/excel/realImportMaterial",
type: "post",
data: JSON.stringify({"result": "no"}),
dataType: "json",
contentType: "application/json;charset=utf-8",
success: function () {
if (socket !== null) {
socket.close();
}
}
})
}
});
} else {
layer.msg(res.msg)
}
@ -281,6 +373,38 @@
});
}
socket.addEventListener('message', function (event) {
layer.close(newIndexShade);
let shadeItem = '<div class="layui-layer-shade" id='+"layui-layer-shade-x"+newIndexShade+' times="753951" style="z-index:1231233; background-color: rgb(0, 0, 0); opacity: 0.8;"></div>';
if ($("#"+"layui-layer-shade-x"+newIndexShade).length <= 0) {
$('body').append(shadeItem);
}
let jsonObject = JSON.parse(event.data);
let re = "";
$("#showImportData").show();
for (let i = 0; i < jsonObject.length; i++) {
var mname = jsonObject[i]["mname"];
var code = jsonObject[i]["code"] == null || jsonObject[i]["code"] === undefined ? "" : jsonObject[i]["code"];
var version = jsonObject[i]["version"] == null || jsonObject[i]["version"] === undefined ? "" : jsonObject[i]["version"];
var texture = jsonObject[i]["texture"] == null || jsonObject[i]["texture"] === undefined ? "" : jsonObject[i]["texture"];
var unit = jsonObject[i]["unit"] == null || jsonObject[i]["unit"] === undefined ? "" : jsonObject[i]["unit"];
var typeId = jsonObject[i]["typeId"] == null || jsonObject[i]["typeId"] === undefined ? "" : jsonObject[i]["typeId"];
var show = "<p style='color: #00FF00'>" + mname + " " + version + " " + code + " " + texture + " " + unit + " " + typeId + " :成功" + "</p>";
re += show;
}
$("#showImportData").append(re);
});
closeShowDataMessage = function () {
$("#layui-layer-shade-x"+newIndexShade).remove();
$("#showImportData").hide();
$("#showImportData").empty();
if (socket !== null) {
socket.close();
}
};
// 监听搜索操作
@ -332,8 +456,7 @@
$(window).on("resize", function () {
layer.full(index);
});
}
else if (obj.event === 'delete') { // 监听删除操作
} else if (obj.event === 'delete') { // 监听删除操作
var checkStatus = table.checkStatus('currentTableId')
, data = checkStatus.data;
var req = {};
@ -378,8 +501,7 @@
layer.msg("未选中记录,请确认!");
return false;
}
}
else if (obj.event === 'applicationIn') {
} else if (obj.event === 'applicationIn') {
// 入库申请
var checkStatus = table.checkStatus('currentTableId')
, data = checkStatus.data;
@ -400,7 +522,7 @@
},
success: function (d) {
layer.close(this.layerIndex);
if (d.status == 200) {
if (d.status === 200) {
layer.open({
type: 2,
title: '入库',
@ -420,14 +542,12 @@
}
})
}
else if (obj.event === 'downloadFile') {
window.open("/download/materialImportDownload","_self");
} else if (obj.event === 'downloadFile') {
window.open("/download/materialImportDownload", "_self");
}
});
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {
console.log(obj)

133
target/classes/templates/pages/materialtype/materialType_view.html

@ -85,6 +85,13 @@
lay-event="realDelete">彻底删除</a>
</script>
<div id="showImportData"
style="height: 500px;width: 500px;position: absolute;overflow: auto;top: 10%;left: 25%;background: #ffffff;z-index: 1231234;display: none">
<div onclick="closeShowDataMessage()" style="position: absolute; right: 0; top: 2%; cursor: pointer;">
<i class="fa fa-window-close-o"></i>
</div>
</div>
</div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
@ -92,6 +99,17 @@
function bindTableToolbarFunction(){
}
function closeShowDataMessage() {
}
let socket;
let newIndexShade;
layui.use(['form', 'table', 'upload'], function () {
var $ = layui.jquery,
form = layui.form,
@ -245,27 +263,98 @@
exts: 'xls|xlsx|csv',
done: function (res) {
//如果上传成功
if (res.code == 200) {
if (res.code === 200) {
var re = "";
for (let i = 0; i < res.data.errMsg.length; i++) {
var show = "<p style='color: #ff211e'>" + res.data.errMsg[i] + ":错误" + "</p>";
re += show
}
console.log(res.data.dataList.length);
for (let i = 0; i < res.data.dataList.length; i++) {
var tname = res.data.dataList[i]["tname"];
var id = res.data.dataList[i]["oldId"];
var parentId = res.data.dataList[i]["parentId"] == null ? "" : res.data.dataList[i]["parentId"];
var introduce = res.data.dataList[i]["introduce"] == null ? "" : res.data.dataList[i]["introduce"];
var show = "<p style='color: #00FF00'>" + tname + " " + id + " " + parentId + "成功" + "</p>";
var show = "<p style='color: #00FF00'>" + tname + " " + id + " " + parentId + "通过" + "</p>";
re += show
}
layer.open({
type: 1,
skin: 'layui-layer-rim', //加上边框
area: ['500px', '500px'], //宽高
content: re
if ("WebSocket" in window) {
socket = new WebSocket('ws://127.0.0.1:11111/webSocket/300450');
switch (socket.readyState) {
case WebSocket.CONNECTING:
// 连接中
socket.onopen = function () {
console.log("连接成功")
};
break;
case WebSocket.OPEN:
// 连接成功
break;
case WebSocket.CLOSING:
// 连接正在关闭。
break;
case WebSocket.CLOSED:
// 连接关闭。
break;
default:
// this never happens
break;
}
}
newIndexShade = layer.open({
type: 1
, title: false //不显示标题栏
, closeBtn: false
, area: ['500px', '500px']
, shade: 0.8
, id: 'LAY_layuipro' //设定一个id,防止重复弹出
, resize: false
, btn: ['导入', '取消']
, btnAlign: 'c'
, moveType: 1 //拖拽模式,0或者1
, content: re
, yes: function (index, layero) {
//按钮【按钮一】的回调
$.ajax({
url:"/excel/realImportMaterialType",
type: "post",
data: JSON.stringify({"result":"yes"}),
dataType: "json",
contentType: "application/json;charset=utf-8",
success:function () {
if (socket !== null) {
socket.close();
}
layer.msg("数据导入完成", {
icon: 0,
time: 1000
})
}
});
}
, btn2: function (index, layero) {
//按钮【按钮二】的回调
$.ajax({
url:"/excel/realImportMaterialType",
type: "post",
data: JSON.stringify({"result":"no"}),
dataType: "json",
contentType: "application/json;charset=utf-8",
success: function () {
if (socket !== null) {
socket.close();
}
}
})
}
});
} else {
layer.msg(res.msg)
}
@ -281,6 +370,36 @@
});
}
socket.addEventListener('message', function (event) {
layer.close(newIndexShade);
let shadeItem = '<div class="layui-layer-shade" id='+"layui-layer-shade-x"+newIndexShade+' times="753951" style="z-index:1231233; background-color: rgb(0, 0, 0); opacity: 0.8;"></div>';
if ($("#"+"layui-layer-shade-x"+newIndexShade).length <= 0) {
$('body').append(shadeItem);
}
let jsonObject = JSON.parse(event.data);
let re = "";
$("#showImportData").show();
for (let i = 0; i < jsonObject.length; i++) {
var tname = jsonObject[i]["tname"];
var id = jsonObject[i]["oldId"];
var parentId = jsonObject[i]["parentId"] == null ? "" : jsonObject[i]["parentId"];
var introduce = jsonObject[i]["introduce"] == null ? "" : jsonObject[i]["introduce"];
var show = "<p style='color: #00FF00'>" + tname + " " + id + " " + parentId + "成功" + "</p>";
re += show
}
$("#showImportData").append(re);
});
closeShowDataMessage = function () {
$("#layui-layer-shade-x"+newIndexShade).remove();
$("#showImportData").hide();
$("#showImportData").empty();
if (socket !== null) {
socket.close();
}
};
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {

Loading…
Cancel
Save