Browse Source

完成除扫码以外的其他基本功能

lwx_dev
erdanergou 3 years ago
parent
commit
5224f6b460
  1. 560
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java
  2. 2
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java
  3. 22
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java
  4. 10
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  5. 20
      src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java
  6. 14
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java
  7. 40
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  8. 7
      src/main/java/com/dreamchaser/depository_manage/mapper/PlaceMapper.xml
  9. 5
      src/main/java/com/dreamchaser/depository_manage/service/DepositoryService.java
  10. 14
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  11. 6
      src/main/java/com/dreamchaser/depository_manage/service/PlaceService.java
  12. 21
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java
  13. 37
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java
  14. 208
      src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java
  15. 28
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  16. 20
      src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java
  17. 2
      src/main/resources/static/js/lay-module/step-lay/step.css
  18. 20
      src/main/resources/static/vue/common/helper.js
  19. 245
      src/main/resources/static/vue/common/permission.js
  20. 13
      src/main/resources/templates/index.html
  21. 10
      src/main/resources/templates/pages/application/form-step-look_back.html
  22. 1108
      src/main/resources/templates/pages/chart/chart-in_back.html
  23. 96
      src/main/resources/templates/pages/chart/chart-out_back.html
  24. 315
      src/main/resources/templates/pages/uniApp/scanQrCode.html
  25. 4
      src/test/java/com/dreamchaser/depository_manage/Test.java
  26. 40
      target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  27. 7
      target/classes/com/dreamchaser/depository_manage/mapper/PlaceMapper.xml
  28. 2
      target/classes/static/js/lay-module/step-lay/step.css
  29. 13
      target/classes/templates/index.html
  30. 10
      target/classes/templates/pages/application/form-step-look_back.html
  31. 1108
      target/classes/templates/pages/chart/chart-in_back.html
  32. 96
      target/classes/templates/pages/chart/chart-out_back.html
  33. 315
      target/classes/templates/pages/uniApp/scanQrCode.html

560
src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java

File diff suppressed because it is too large

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

@ -108,7 +108,7 @@ public class DepositoryRecordController {
if(params.size() < 1 && map.size() > 3) { if(params.size() < 1 && map.size() > 3) {
// 获取库位id // 获取库位id
Integer placeId = ObjectFormatUtil.toInteger(map.get("placeId")); Integer placeId = ObjectFormatUtil.toInteger(map.get("placeId"));
if(placeId == -1) {// 如果插入到仓库 if(placeId == 0) {// 如果插入到仓库
map.put("placeId",0); // 到默认库位 map.put("placeId",0); // 到默认库位
integer += depositoryRecordService.applicationInPlace(map); integer += depositoryRecordService.applicationInPlace(map);
}else{ // 如果具体到库位 }else{ // 如果具体到库位

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

@ -52,16 +52,22 @@ public class MaterialController {
public RestResponse findInventory(@RequestParam Map<String,Object> map,HttpServletRequest request){ public RestResponse findInventory(@RequestParam Map<String,Object> map,HttpServletRequest request){
UserByPort userToken= (UserByPort) request.getAttribute("userToken"); UserByPort userToken= (UserByPort) request.getAttribute("userToken");
List<RoleAndDepository> depositoryAndRole = roleService.findDepositoryAndRole(userToken.getId()); List<RoleAndDepository> depositoryAndRole = roleService.findDepositoryAndRole(userToken.getId());
List<MaterialP> materialPByCondition = materialService.findInventory(map); List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString());
List<MaterialP> list = new ArrayList<>(); List<MaterialP> list = new ArrayList<>();
Integer total = 0;
for (int i = 0; i < depositoryByAdminorg.size(); i++) {
map.put("depositoryId",depositoryByAdminorg.get(i).getId());
List<MaterialP> inventory = materialService.findInventory(map);
list.addAll(inventory);
total += materialService.findInventoryCount(map);
}
for (RoleAndDepository roleAndDepository : depositoryAndRole) { for (RoleAndDepository roleAndDepository : depositoryAndRole) {
for (MaterialP materialP : materialPByCondition) { List<MaterialP> materialByDepository = materialService.findMaterialByDepository(roleAndDepository.getDepositoryId());
if (Objects.equals(materialP.getDepositoryId(), roleAndDepository.getDepositoryId())) { list.addAll(materialByDepository);
list.add(materialP); total += list.size();
}
}
} }
return new RestResponse(list,list.size(),200); return new RestResponse(list,total,200);
} }
/** /**
@ -172,7 +178,7 @@ public class MaterialController {
if("out".equals(type)) { if("out".equals(type)) {
for (int i = 0; i < depositoryByAdminorg.size(); i++) { for (int i = 0; i < depositoryByAdminorg.size(); i++) {
param.put("depositoryId", depositoryByAdminorg.get(i).getId()); param.put("depositoryId", depositoryByAdminorg.get(i).getId());
materialPByCondition = materialService.findMaterialPByCondition(param); materialPByCondition = materialService.findInventory(param);
if (materialPByCondition.size() > 0) { if (materialPByCondition.size() > 0) {
break; break;
} }

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

@ -643,14 +643,6 @@ public class PageController {
public ModelAndView chart_in_back() { public ModelAndView chart_in_back() {
ModelAndView mv = new ModelAndView(); ModelAndView mv = new ModelAndView();
mv.setViewName("pages/chart/chart-in_back"); mv.setViewName("pages/chart/chart-in_back");
/**
* 仓库总数
*/
mv.addObject("depositories", depositoryService.findDepositoryAll());
/**
* 物料总数
*/
mv.addObject("materials", materialService.findMaterialAll());
// 转入物料数量 // 转入物料数量
mv.addObject("InCount", depositoryRecordService.CalculateAllApplicationInCount()); mv.addObject("InCount", depositoryRecordService.CalculateAllApplicationInCount());
@ -1411,7 +1403,7 @@ public class PageController {
@GetMapping("/scanQrCode") @GetMapping("/scanQrCode")
public String scanQrCode(){ public String scanQrCode(){
return "pages/uniApp/scanQrCode"; return "pages/uniApp/scanQrCodePlus?callback='/index'";
} }
} }

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

@ -16,10 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController @RestController
@RequestMapping("/place") @RequestMapping("/place")
@ -140,6 +137,21 @@ public class PlaceController {
else{ else{
throw new MyException("所需请求参数缺失!"); throw new MyException("所需请求参数缺失!");
} }
Place placeById = placeService.findPlaceById(0);
if(placeById == null){
Map<String,Object> defaultPlace = new HashMap<>();
defaultPlace.put("id",0);
defaultPlace.put("x",0);
defaultPlace.put("z",0);
defaultPlace.put("code","0000");
defaultPlace.put("min",0);
defaultPlace.put("max",999999999);
defaultPlace.put("state",1);
defaultPlace.put("did",0);
defaultPlace.put("quantity",0);
placeService.InsertPlace(defaultPlace);
}
if ("one".equals(type)) { if ("one".equals(type)) {
return CrudUtil.postHandle(success, 1); return CrudUtil.postHandle(success, 1);
} else if("list".equals(type)){ } else if("list".equals(type)){

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

@ -67,6 +67,13 @@ public interface MaterialMapper {
*/ */
List<Material> findMaterialByCondition(Map<String,Object>map); List<Material> findMaterialByCondition(Map<String,Object>map);
/**
* 根据条件查询符合条件的库存总数
* @param map
* @return
*/
Integer findInventoryCount(Map<String,Object> map);
/** /**
* 根据条件查询符合条件的库存 * 根据条件查询符合条件的库存
* @param map * @param map
@ -136,4 +143,11 @@ public interface MaterialMapper {
*/ */
List<Material> findMaterialByDepositorys(List<Integer> ids); List<Material> findMaterialByDepositorys(List<Integer> ids);
/**
* 根据仓库查询物品
* @param depositoryId
* @return
*/
List<Material> findMaterialByDepository(Integer depositoryId);
} }

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

@ -124,6 +124,7 @@
<if test="code != null and code != '' "> <if test="code != null and code != '' ">
and code = #{code} and code = #{code}
</if> </if>
and depository_id is null
<if test="begin != null and size != null"> <if test="begin != null and size != null">
LIMIT #{begin},#{size} LIMIT #{begin},#{size}
</if> </if>
@ -165,6 +166,38 @@
</if> </if>
</select> </select>
<select id="findInventoryCount" parameterType="map" resultType="int">
SELECT
count(*)
from findMaterial
where 1 = 1
<if test="mid != null">
and id = #{mid}
</if>
<if test="depositoryId != null">
AND depository_id = #{depositoryId}
</if>
<if test="mname != null and mname != ''">
AND mname LIKE CONCAT('%', #{mname}, '%')
</if>
<if test="quantity != null">
AND quantity = #{quantity}
</if>
<if test="price != null">
AND price = #{price}
</if>
<if test="materialTypeId != null">
AND type_id = #{materialTypeId}
</if>
<if test="state != null and state != ''">
And state = #{state}
</if>
<if test="code != null and code != '' ">
and code = #{code}
</if>
and depository_id is not null
</select>
<!-- 根据仓库查询物料--> <!-- 根据仓库查询物料-->
<select id="findMaterialByDepositorys" resultMap="materialMap" parameterType="list"> <select id="findMaterialByDepositorys" resultMap="materialMap" parameterType="list">
SELECT SELECT
@ -176,6 +209,13 @@
#{item} #{item}
</foreach> </foreach>
</select> </select>
<!-- 根据仓库查询物料-->
<select id="findMaterialByDepository" resultMap="materialMap" parameterType="int">
SELECT
<include refid="allColumns" />
from material m
where m.depository_id = #{depositoryId}
</select>
<!-- 根据主键查询数据 --> <!-- 根据主键查询数据 -->

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

@ -53,12 +53,13 @@
<include refid="allColumns" /> <include refid="allColumns" />
from materialandplace mp left join place p on p.id = mp.pid from materialandplace mp left join place p on p.id = mp.pid
where 1 = 1 where 1 = 1
<if test="did != null and did != ''">
and p.did = #{did}
</if>
<if test="mid != null and mid != ''"> <if test="mid != null and mid != ''">
and mp.mid = #{mid} and mp.mid = #{mid}
</if> </if>
<if test="did != null and did != ''">
and ( p.did = #{did} or p.did = 0)
</if>
</select> </select>
<!-- 根据条件参数查询列表 --> <!-- 根据条件参数查询列表 -->

5
src/main/java/com/dreamchaser/depository_manage/service/DepositoryService.java

@ -1,6 +1,7 @@
package com.dreamchaser.depository_manage.service; package com.dreamchaser.depository_manage.service;
import com.dreamchaser.depository_manage.entity.Depository; import com.dreamchaser.depository_manage.entity.Depository;
import com.dreamchaser.depository_manage.entity.UserByPort;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -109,11 +110,11 @@ public interface DepositoryService {
* 查询所有仓库名称即对应编号 * 查询所有仓库名称即对应编号
* @return * @return
*/ */
Map<String,Integer> findDepositoryAllNameAndId(); Map<String,Integer> findDepositoryAllNameAndId(UserByPort user);
/** /**
* 根据仓库名称获取当前仓库库存容量 * 根据名称或编码获取当前仓库库存容量
* @param dname * @param dname
* @return * @return
*/ */

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

@ -58,6 +58,13 @@ public interface MaterialService {
*/ */
List<MaterialP> findInventory(Map<String,Object> map); List<MaterialP> findInventory(Map<String,Object> map);
/**
* 根据条件查询符合条件的库存总数
* @param map
* @return
*/
Integer findInventoryCount(Map<String,Object> map);
/** /**
* 根据编码获取对应物料 * 根据编码获取对应物料
* @return * @return
@ -149,4 +156,11 @@ public interface MaterialService {
* @return * @return
*/ */
List<Material> findMaterialByDepositorys(List<Integer> dids); List<Material> findMaterialByDepositorys(List<Integer> dids);
/**
* 根据仓库查询物品
* @param depositoryId
* @return
*/
List<MaterialP> findMaterialByDepository(Integer depositoryId);
} }

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

@ -102,5 +102,11 @@ public interface PlaceService {
*/ */
MaterialAndPlace findPlaceAndMaterialByMidAndPid(Integer pid,Integer mid); MaterialAndPlace findPlaceAndMaterialByMidAndPid(Integer pid,Integer mid);
/**
* 添加物料到库位
* @param map
* @return
*/
Integer addMaterialOnPlace(Map<String,Object> map);
} }

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

@ -107,8 +107,9 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
} }
Map<String, Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
param.put("depositoryId", depositoryId); param.put("depositoryId", depositoryId);
param.put("mname", material.getMname()); param.put("code", material.getCode());
List<Material> materialByCondition = materialMapper.findMaterialByCondition(param); // 判断该仓库中有无该物体
List<Material> materialByCondition = materialMapper.findInventory(param);
// 获取当前入库金额 // 获取当前入库金额
Double amounts = (quantity * price * 100); Double amounts = (quantity * price * 100);
// 获取平均价格 // 获取平均价格
@ -364,7 +365,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("fromPlaceId",0); map.put("fromPlaceId",0);
} }
map.put("toPlaceId",toPlaceId) ; map.put("toPlaceId",toPlaceId) ;
if("".equals(toPlaceId) || "0".equals(fromPlaceId)){ if("".equals(toPlaceId) || "0".equals(toPlaceId)){
map.put("toPlaceId",0); map.put("toPlaceId",0);
} }
//清除主键 //清除主键
@ -439,6 +440,16 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 如果当前库位数量不足 // 如果当前库位数量不足
flag = false; flag = false;
} }
}else{
Map<String,Object> params = new HashMap<>();
params.put("mid",material.getId());
params.put("pid",0);
// 获取当前物料在默认库位中的数量
placeAndMaterialByMidAndPid = placeMapper.findPlaceAndMaterialByMidAndPid(params);
if(placeAndMaterialByMidAndPid.getQuantity() < record.getQuantity()){
// 如果当前库位数量不足
flag = false;
}
} }
if (material.getQuantity() >= record.getQuantity() && flag) { if (material.getQuantity() >= record.getQuantity() && flag) {
// 当前出库金额 // 当前出库金额
@ -496,9 +507,9 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
TransferRecord transferRecor = transferRecordMapper.findTransferRecordById(transferId); TransferRecord transferRecor = transferRecordMapper.findTransferRecordById(transferId);
Integer mid = transferRecor.getMid(); Integer mid = transferRecor.getMid();
Material material = materialMapper.findMaterialById(mid); Material material = materialMapper.findMaterialById(mid);
param.put("mname", material.getMname()); param.put("code", material.getCode());
param.put("depositoryId", transferRecor.getToId()); param.put("depositoryId", transferRecor.getToId());
List<Material> materiallist = materialMapper.findMaterialByCondition(param); List<Material> materiallist = materialMapper.findInventory(param);
if (materiallist.size() > 0) { if (materiallist.size() > 0) {
// 如果在该仓库 // 如果在该仓库
map.put("price",material.getPrice().toString()); map.put("price",material.getPrice().toString());

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

@ -239,14 +239,39 @@ public class DepositoryServiceImpl implements DepositoryService {
return depositoryMapper.findAllCountByState(); return depositoryMapper.findAllCountByState();
} }
/**
* 获取本部门以及个人管理仓库的名称和id
* @return
*/
@Override @Override
public Map<String, Integer> findDepositoryAllNameAndId() { public Map<String, Integer> findDepositoryAllNameAndId(UserByPort user) {
List<Depository> depositoryAll = depositoryMapper.findDepositoryAll(); // 获取当前用户所在部门管理的仓库
Map<String,Integer> map = new HashMap<>(); List<Depository> depositoryByAdminorg = depositoryMapper.findDepositoryByAdminorg(user.getMaindeparmentname());
for (int i = 0; i < depositoryAll.size(); i++) {
if(depositoryAll.get(i).getParentId() != 0) { // 仓库id列表
map.put(depositoryAll.get(i).getDname() + "," + depositoryAll.get(i).getCode(), depositoryAll.get(i).getId()); List<Integer> depositoryListId = new ArrayList<>();
// 添加到id列表
for (Depository depository : depositoryByAdminorg) {
depositoryListId.add(depository.getId());
}
// 获取当前用户管理的仓库
List<RoleAndDepository> depositoryAndRole = roleMapper.findDepositoryAndRole(user.getId());
for (int i = 0; i < depositoryAndRole.size(); i++) {
RoleAndDepository roleAndDepository = depositoryAndRole.get(i);
// 如果重复则跳过
if(depositoryListId.get(i).compareTo(roleAndDepository.getDepositoryId()) == 0){
continue;
} }
depositoryListId.add(roleAndDepository.getDepositoryId());
}
Map<String,Integer> map = new HashMap<>();
for (int i = 0; i < depositoryListId.size(); i++) {
Integer depositoryId = depositoryListId.get(i);
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId);
map.put(depositoryRecordById.getDname() + "," + depositoryRecordById.getCode(), depositoryRecordById.getId());
} }
return map; return map;
} }

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

@ -36,14 +36,16 @@ public class ExcelServiceImpl implements ExcelService {
@Autowired @Autowired
PlaceService placeService; PlaceService placeService;
/** /**
* 用于导入物料名称 * 用于导入物料名称
*
* @param file * @param file
* @param excelInfo * @param excelInfo
* @return * @return
*/ */
@Override @Override
public ResultVo importExcelMaterial(MultipartFile file,String excelInfo) { public ResultVo importExcelMaterial(MultipartFile file, String excelInfo) {
// 1.入参校验 // 1.入参校验
ResultVo<String> checkExcelParam = excelutil.checkExcelParam(file); ResultVo<String> checkExcelParam = excelutil.checkExcelParam(file);
if (!checkExcelParam.checkSuccess()) { if (!checkExcelParam.checkSuccess()) {
@ -55,19 +57,19 @@ public class ExcelServiceImpl implements ExcelService {
if (!resultVo.checkSuccess()) { if (!resultVo.checkSuccess()) {
return resultVo; return resultVo;
} }
String filePath = (String)resultVo.getData(); String filePath = (String) resultVo.getData();
if (StringUtils.isBlank(filePath)) { if (StringUtils.isBlank(filePath)) {
return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空"); return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空");
} }
// 3.读取excel文件 // 3.读取excel文件
Map<String,Object> readResult = new HashMap<>(); Map<String, Object> readResult = new HashMap<>();
if("material".equals(excelInfo)){ if ("material".equals(excelInfo)) {
readResult = excelutil.simpleExcelRead(filePath, ExcelInfo.class); readResult = excelutil.simpleExcelRead(filePath, ExcelInfo.class);
} }
List<ExcelInfo> excelVos = (List<ExcelInfo>) readResult.get("dataList"); List<ExcelInfo> excelVos = (List<ExcelInfo>) readResult.get("dataList");
List<String> errMsg =(List<String>) readResult.get("errMsg"); List<String> errMsg = (List<String>) readResult.get("errMsg");
boolean empty = CollectionUtil.isEmpty(excelVos); boolean empty = CollectionUtil.isEmpty(excelVos);
if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1) ) { if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1)) {
log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename()); log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename());
return ResultVoUtil.error("上传Excel文件为空"); return ResultVoUtil.error("上传Excel文件为空");
} }
@ -76,25 +78,25 @@ public class ExcelServiceImpl implements ExcelService {
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil(); TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
taskCenterUtil.submitTask(() -> { taskCenterUtil.submitTask(() -> {
List<Object> success = new ArrayList<>(); List<Object> success = new ArrayList<>();
Map<String,Object> returnResult = new HashMap<>(); Map<String, Object> returnResult = new HashMap<>();
for (int i = 0; i < excelVos.size(); i++) { for (int i = 0; i < excelVos.size(); i++) {
Map<String,Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
param.put("mname",excelVos.get(i).getMname()); param.put("mname", excelVos.get(i).getMname());
param.put("code",excelVos.get(i).getCode()); param.put("code", excelVos.get(i).getCode());
param.put("unit",excelVos.get(i).getUnit()); param.put("unit", excelVos.get(i).getUnit());
param.put("version",excelVos.get(i).getVersion()); param.put("version", excelVos.get(i).getVersion());
param.put("texture",excelVos.get(i).getTexture()); param.put("texture", excelVos.get(i).getTexture());
param.put("materialTypeId",excelVos.get(i).getTypeId()); param.put("materialTypeId", excelVos.get(i).getTypeId());
param.put("id",excelVos.get(i).getId()); param.put("id", excelVos.get(i).getId());
materialService.insertMaterial(param); materialService.insertMaterial(param);
success.add(excelVos.get(i)); success.add(excelVos.get(i));
} }
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos)); log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos));
returnResult.put("success",success); returnResult.put("success", success);
returnResult.put("errMsg",errMsg); returnResult.put("errMsg", errMsg);
return ResultVoUtil.returnResultVo(200,returnResult,"结果"); return ResultVoUtil.returnResultVo(200, returnResult, "结果");
}); });
// 4.2删除临时文件 // 4.2删除临时文件
boolean deleteFile = FileUtil.deleteFile(new File(filePath)); boolean deleteFile = FileUtil.deleteFile(new File(filePath));
@ -103,12 +105,13 @@ public class ExcelServiceImpl implements ExcelService {
return ResultVoUtil.error("删除临时文件失败"); return ResultVoUtil.error("删除临时文件失败");
} }
log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath); log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath);
return ResultVoUtil.returnResultVo(200,readResult,"结果"); return ResultVoUtil.returnResultVo(200, readResult, "结果");
// return ResultVoUtil.success(excelVos); // return ResultVoUtil.success(excelVos);
} }
/** /**
* 用于导入物料分类 * 用于导入物料分类
*
* @param file * @param file
* @return * @return
*/ */
@ -125,20 +128,20 @@ public class ExcelServiceImpl implements ExcelService {
if (!resultVo.checkSuccess()) { if (!resultVo.checkSuccess()) {
return resultVo; return resultVo;
} }
String filePath = (String)resultVo.getData(); String filePath = (String) resultVo.getData();
if (StringUtils.isBlank(filePath)) { if (StringUtils.isBlank(filePath)) {
return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空"); return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空");
} }
// 3.读取excel文件 // 3.读取excel文件
Map<String,Object> readResult = excelutil.simpleExcelRead(filePath, ExcelInfoByMT.class); Map<String, Object> readResult = excelutil.simpleExcelRead(filePath, ExcelInfoByMT.class);
List<ExcelInfoByMT> excelVos = (List<ExcelInfoByMT>) readResult.get("dataList"); List<ExcelInfoByMT> excelVos = (List<ExcelInfoByMT>) readResult.get("dataList");
List<String> errMsg =(List<String>) readResult.get("errMsg"); List<String> errMsg = (List<String>) readResult.get("errMsg");
boolean empty = CollectionUtil.isEmpty(excelVos); boolean empty = CollectionUtil.isEmpty(excelVos);
if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1) ) { if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1)) {
log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename()); log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename());
return ResultVoUtil.error("上传Excel文件为空"); return ResultVoUtil.error("上传Excel文件为空");
} }
if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1) ) { if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1)) {
log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename()); log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename());
return ResultVoUtil.error("上传Excel文件为空"); return ResultVoUtil.error("上传Excel文件为空");
} }
@ -147,16 +150,16 @@ public class ExcelServiceImpl implements ExcelService {
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil(); TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
taskCenterUtil.submitTask(() -> { taskCenterUtil.submitTask(() -> {
List<Object> success = new ArrayList<>(); List<Object> success = new ArrayList<>();
Map<String,Object> returnResult = new HashMap<>(); Map<String, Object> returnResult = new HashMap<>();
for (int i = 0; i < excelVos.size(); i++) { for (int i = 0; i < excelVos.size(); i++) {
Map<String,Object> insert = new HashMap<>(); Map<String, Object> insert = new HashMap<>();
insert.put("id",excelVos.get(i).getId()); insert.put("id", excelVos.get(i).getId());
insert.put("tname",excelVos.get(i).getTname()); insert.put("tname", excelVos.get(i).getTname());
insert.put("introduce",excelVos.get(i).getIntroduce()); insert.put("introduce", excelVos.get(i).getIntroduce());
if(excelVos.get(i).getParentId() == null){ if (excelVos.get(i).getParentId() == null) {
insert.put("materialTypeId",0); insert.put("materialTypeId", 0);
}else { } else {
insert.put("materialTypeId", excelVos.get(i).getParentId()); insert.put("materialTypeId", excelVos.get(i).getParentId());
} }
materialTypeService.insertMaterialType(insert); materialTypeService.insertMaterialType(insert);
@ -164,9 +167,9 @@ public class ExcelServiceImpl implements ExcelService {
} }
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos)); log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos));
returnResult.put("success",success); returnResult.put("success", success);
returnResult.put("errMsg",errMsg); returnResult.put("errMsg", errMsg);
return ResultVoUtil.returnResultVo(200,returnResult,"结果"); return ResultVoUtil.returnResultVo(200, returnResult, "结果");
}); });
// 4.2删除临时文件 // 4.2删除临时文件
boolean deleteFile = FileUtil.deleteFile(new File(filePath)); boolean deleteFile = FileUtil.deleteFile(new File(filePath));
@ -175,7 +178,7 @@ public class ExcelServiceImpl implements ExcelService {
return ResultVoUtil.error("删除临时文件失败"); return ResultVoUtil.error("删除临时文件失败");
} }
log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath); log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath);
return ResultVoUtil.returnResultVo(200,readResult,"结果"); return ResultVoUtil.returnResultVo(200, readResult, "结果");
// return ResultVoUtil.success(excelVos); // return ResultVoUtil.success(excelVos);
} }
@ -183,6 +186,7 @@ public class ExcelServiceImpl implements ExcelService {
/** /**
* 用于导入库存信息 * 用于导入库存信息
*
* @param file * @param file
* @return * @return
*/ */
@ -199,21 +203,21 @@ public class ExcelServiceImpl implements ExcelService {
if (!resultVo.checkSuccess()) { if (!resultVo.checkSuccess()) {
return resultVo; return resultVo;
} }
String filePath = (String)resultVo.getData(); String filePath = (String) resultVo.getData();
if (StringUtils.isBlank(filePath)) { if (StringUtils.isBlank(filePath)) {
return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空"); return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空");
} }
// 3.读取excel文件 // 3.读取excel文件
Map<String,Object> readResult = excelutil.simpleExcelRead(filePath, ExcelInfoByInventory.class); Map<String, Object> readResult = excelutil.simpleExcelRead(filePath, ExcelInfoByInventory.class);
List<ExcelInfoByInventory> excelInfoByInventories = (List<ExcelInfoByInventory>) readResult.get("dataList"); List<ExcelInfoByInventory> excelInfoByInventories = (List<ExcelInfoByInventory>) readResult.get("dataList");
List<String> errMsg =(List<String>) readResult.get("errMsg"); List<String> errMsg = (List<String>) readResult.get("errMsg");
List<String> dataIndex =(List<String>) readResult.get("dataIndex"); List<String> dataIndex = (List<String>) readResult.get("dataIndex");
boolean empty = CollectionUtil.isEmpty(excelInfoByInventories); boolean empty = CollectionUtil.isEmpty(excelInfoByInventories);
if ((CollectionUtil.isEmpty(excelInfoByInventories) && errMsg.size() < 1) || (excelInfoByInventories.size() < 2 && errMsg.size() < 1) ) { if ((CollectionUtil.isEmpty(excelInfoByInventories) && errMsg.size() < 1) || (excelInfoByInventories.size() < 2 && errMsg.size() < 1)) {
log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename()); log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename());
return ResultVoUtil.error("上传Excel文件为空"); return ResultVoUtil.error("上传Excel文件为空");
} }
if ((CollectionUtil.isEmpty(excelInfoByInventories) && errMsg.size() < 1) || (excelInfoByInventories.size() < 2 && errMsg.size() < 1) ) { if ((CollectionUtil.isEmpty(excelInfoByInventories) && errMsg.size() < 1) || (excelInfoByInventories.size() < 2 && errMsg.size() < 1)) {
log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename()); log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename());
return ResultVoUtil.error("上传Excel文件为空"); return ResultVoUtil.error("上传Excel文件为空");
} }
@ -225,92 +229,110 @@ public class ExcelServiceImpl implements ExcelService {
String placeCode = excelInfoByInventories.get(i).getDepositoryCode(); String placeCode = excelInfoByInventories.get(i).getDepositoryCode();
Integer depositoryId = excelInfoByInventories.get(i).getDepositoryId(); Integer depositoryId = excelInfoByInventories.get(i).getDepositoryId();
// 如果导入时输入库位信息 // 如果导入时输入库位信息
if(!placeCode.isEmpty()) { if (placeCode != null && !placeCode.isEmpty()) {
Map<String,Object> placeMap = new HashMap<>(); Map<String, Object> placeMap = new HashMap<>();
placeMap.put("did",depositoryId); placeMap.put("did", depositoryId);
placeMap.put("code",placeCode); placeMap.put("code", placeCode);
// 根据仓库及库位码获取库位 // 根据仓库及库位码获取库位
List<Place> placeByCondition = placeService.findPlaceByCondition(placeMap); List<Place> placeByCondition = placeService.findPlaceByCondition(placeMap);
if(placeByCondition.size()>0){ if (placeByCondition.size() > 0) {
// 如果有库位 // 如果有库位
Place place = placeByCondition.get(0); Place place = placeByCondition.get(0);
// 如果库位有物料 // 如果库位有物料且该库位存放的物料为当前物料
if(!Objects.equals(place.getMid(), materialByCode.getId())) { Integer quantity = ObjectFormatUtil.toInteger(excelInfoByInventories.get(i).getQuantity());
// 如果该库位的物料不是当前物料 if (quantity > place.getMax() - place.getQuantity()) {
// 如果当前库位无法放下
String s = dataIndex.get(i); String s = dataIndex.get(i);
String msg = s + "出现异常:" + excelInfoByInventories.get(i).getDepositoryCode() + " 该库位已有物料"; String msg = s + "出现异常:" + excelInfoByInventories.get(i).getDepositoryCode() + " 该库位无法存放当前数目的物料";
errMsg.add(msg); errMsg.add(msg);
continue; continue;
}else { } else {
// 如果当前库位没有物料或该库位存放的物料为当前物料 // 修改当前库位库存
Integer quantity = ObjectFormatUtil.toInteger(excelInfoByInventories.get(i).getQuantity()); Map<String, Object> updatePlace = new HashMap<>();
if(quantity > place.getMax() - place.getQuantity()){ updatePlace.put("id", place.getId());
// 如果当前库位无法放下 updatePlace.put("quantity", quantity + place.getQuantity());
String s = dataIndex.get(i); placeService.UpdatePlace(updatePlace);
String msg = s + "出现异常:" + excelInfoByInventories.get(i).getDepositoryCode() + " 该库位无法存放当前数目的物料"; excelVos.add(excelInfoByInventories.get(i));
errMsg.add(msg); // 添加库位与物料记录
continue; updatePlace.remove("id");
}else { updatePlace.put("mid", materialByCode.getId());
Map<String, Object> updatePlace = new HashMap<>(); updatePlace.put("pid", place.getId());
updatePlace.put("mid", materialByCode.getId()); placeService.addMaterialOnPlace(updatePlace);
updatePlace.put("id", place.getId());
updatePlace.put("quantity",quantity + place.getQuantity());
excelVos.add(excelInfoByInventories.get(i));
placeService.UpdatePlace(updatePlace);
}
} }
}else{ } else {
String s = dataIndex.get(i); String s = dataIndex.get(i);
String msg = s + "出现异常:" + excelInfoByInventories.get(i).getDepositoryCode() + " 该仓库没有该库位"; String msg = s + "出现异常:" + excelInfoByInventories.get(i).getDepositoryCode() + " 该仓库没有该库位";
errMsg.add(msg); errMsg.add(msg);
continue; continue;
} }
} else { // 否则直接加入
excelVos.add(excelInfoByInventories.get(i));
} }
} }
readResult.put("dataList",excelVos); readResult.put("dataList", excelVos);
// 4.通过线程池开启一个线程去执行数据库操作,主线程继续往下执行 // 4.通过线程池开启一个线程去执行数据库操作,主线程继续往下执行
// 4.1开启一个线程 // 4.1开启一个线程
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil(); TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
taskCenterUtil.submitTask(() -> { taskCenterUtil.submitTask(() -> {
List<Object> success = new ArrayList<>(); List<Object> success = new ArrayList<>();
Map<String,Object> returnResult = new HashMap<>(); Map<String, Object> returnResult = new HashMap<>();
for (int i = 0; i < excelVos.size(); i++) { for (int i = 0; i < excelVos.size(); i++) {
// 获取对应物料 // 获取对应物料
Material materialByCode = materialService.findMaterialByCode(excelVos.get(i).getCode()); Material materialByCode = materialService.findMaterialByCode(excelVos.get(i).getCode());
Map<String,Object> update = new HashMap<>(); // 添加库存记录
Map<String, Object> insert = new HashMap<>();
Integer depositoryId = excelVos.get(i).getDepositoryId(); Integer depositoryId = excelVos.get(i).getDepositoryId();
update.put("quantity",String.valueOf(ObjectFormatUtil.toInteger(excelVos.get(i).getQuantity()) + materialByCode.getQuantity())); insert.put("mname", materialByCode.getMname());
insert.put("materialTypeId", materialByCode.getTypeId());
insert.put("state", materialByCode.getState());
insert.put("code", materialByCode.getCode());
insert.put("unit", materialByCode.getUnit());
insert.put("texture", materialByCode.getTexture());
insert.put("quantity", String.valueOf(ObjectFormatUtil.toInteger(excelVos.get(i).getQuantity()) + materialByCode.getQuantity()));
// 如果模板中总金额未填写 // 如果模板中总金额未填写
if(excelVos.get(i).getAmounts() == null || "".equals(excelVos.get(i).getAmounts())){ if (excelVos.get(i).getAmounts() == null || "".equals(excelVos.get(i).getAmounts())) {
// 求均值 // 求均值
// 总金额 // 总金额
Double amounts = Double.parseDouble(excelVos.get(i).getPrice())*100 * Double.parseDouble(excelVos.get(i).getQuantity()); Double amounts = Double.parseDouble(excelVos.get(i).getPrice()) * 100 * Double.parseDouble(excelVos.get(i).getQuantity());
update.put("amounts",String.valueOf(materialByCode.getAmounts()+amounts)); insert.put("amounts", String.valueOf(materialByCode.getAmounts() + amounts));
// 保留两位 // 保留两位
Double avgPrice = (materialByCode.getAmounts()+amounts) / (Double.parseDouble(excelVos.get(i).getQuantity()) + materialByCode.getQuantity() ); Double avgPrice = (materialByCode.getAmounts() + amounts) / (Double.parseDouble(excelVos.get(i).getQuantity()) + materialByCode.getQuantity());
BigDecimal bg = new BigDecimal(avgPrice); BigDecimal bg = new BigDecimal(avgPrice);
avgPrice = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); avgPrice = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
update.put("price",String.valueOf(avgPrice)); insert.put("price", String.valueOf(avgPrice));
}else { } else {
// 求均值 // 求均值
update.put("amounts", String.valueOf(materialByCode.getAmounts()+Double.parseDouble(excelVos.get(i).getAmounts()) * 100)); insert.put("amounts", String.valueOf(materialByCode.getAmounts() + Double.parseDouble(excelVos.get(i).getAmounts()) * 100));
Double avgPrice = (materialByCode.getAmounts()+Double.parseDouble(excelVos.get(i).getAmounts()) * 100) / ((Double.parseDouble(excelVos.get(i).getQuantity()) + materialByCode.getQuantity() )); Double avgPrice = (materialByCode.getAmounts() + Double.parseDouble(excelVos.get(i).getAmounts()) * 100) / ((Double.parseDouble(excelVos.get(i).getQuantity()) + materialByCode.getQuantity()));
// 保留两位 // 保留两位
BigDecimal bg = new BigDecimal(avgPrice); BigDecimal bg = new BigDecimal(avgPrice);
avgPrice = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); avgPrice = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
update.put("price",String.valueOf(avgPrice)); insert.put("price", String.valueOf(avgPrice));
} }
update.put("depositoryId", depositoryId); insert.put("depositoryId", depositoryId);
update.put("depositoryCode",excelVos.get(i).getDepositoryCode()); insert.put("depositoryCode", excelVos.get(i).getDepositoryCode());
update.put("id",materialByCode.getId()); materialService.insertMaterial(insert);
materialService.updateMaterial(update);
// 将该物料同时放入默认库位中
Map<String,Object> param = new HashMap<>();
// 获取默认库位
Place placeById = placeService.findPlaceById(0);
// 修改默认库位库存
placeById.setQuantity(placeById.getQuantity() + ObjectFormatUtil.toInteger(excelVos.get(i).getQuantity()));
placeService.UpdatePlace(placeById);
// 添加库位与物料的映射
param.put("mid",materialByCode.getId());
param.put("pid",0);
param.put("quantity",ObjectFormatUtil.toInteger(excelVos.get(i).getQuantity()));
placeService.addMaterialOnPlace(param);
success.add(excelVos.get(i)); success.add(excelVos.get(i));
} }
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos)); log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos));
returnResult.put("success",success); returnResult.put("success", success);
returnResult.put("errMsg",errMsg); returnResult.put("errMsg", errMsg);
return ResultVoUtil.returnResultVo(200,returnResult,"结果"); return ResultVoUtil.returnResultVo(200, returnResult, "结果");
}); });
// 4.2删除临时文件 // 4.2删除临时文件
boolean deleteFile = FileUtil.deleteFile(new File(filePath)); boolean deleteFile = FileUtil.deleteFile(new File(filePath));
@ -319,6 +341,6 @@ public class ExcelServiceImpl implements ExcelService {
return ResultVoUtil.error("删除临时文件失败"); return ResultVoUtil.error("删除临时文件失败");
} }
log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath); log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath);
return ResultVoUtil.returnResultVo(200,readResult,"结果"); return ResultVoUtil.returnResultVo(200, readResult, "结果");
} }
} }

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

@ -127,12 +127,16 @@ public class MaterialServiceImpl implements MaterialService {
// 获取当前物料所处仓库 // 获取当前物料所处仓库
Integer depositoryId = list.get(i).getDepositoryId(); Integer depositoryId = list.get(i).getDepositoryId();
// 获取当前物料所处库位 // 获取当前物料所处库位
Integer mid = list.get(i).getId();
List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(mid, depositoryId);
StringBuilder placeCode = new StringBuilder(); StringBuilder placeCode = new StringBuilder();
for (int j = 0; j < placeByMidAndDid.size(); j++) { if(depositoryId != null) {
placeCode.append(placeByMidAndDid.get(j).getCode()).append(" "); Integer mid = list.get(i).getId();
List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(mid, depositoryId);
for (int j = 0; j < placeByMidAndDid.size(); j++) {
placeCode.append(placeByMidAndDid.get(j).getCode()).append(" ");
}
} }
if(depositoryId != null){ if(depositoryId != null){
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId); Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId);
String code = depositoryRecordById.getCode(); String code = depositoryRecordById.getCode();
@ -182,6 +186,16 @@ public class MaterialServiceImpl implements MaterialService {
return pack(list); return pack(list);
} }
/**
* 根据条件查询符合条件的库存总数
* @param map
* @return
*/
@Override
public Integer findInventoryCount(Map<String, Object> map) {
return materialMapper.findInventoryCount(map);
}
/** /**
* 根据编码获取对应物料 * 根据编码获取对应物料
* @return * @return
@ -362,6 +376,12 @@ public class MaterialServiceImpl implements MaterialService {
return materialMapper.findMaterialByDepositorys(dids); return materialMapper.findMaterialByDepositorys(dids);
} }
@Override
public List<MaterialP> findMaterialByDepository(Integer depositoryId) {
List<Material> materialByDepository = materialMapper.findMaterialByDepository(depositoryId);
return pack(materialByDepository);
}
/** /**
* 构造树形选择框 * 构造树形选择框
* @return * @return

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

@ -179,8 +179,13 @@ public class PlaceServiceImpl implements PlaceService {
for (int i = 0; i < placeByCondition.size(); i++) { for (int i = 0; i < placeByCondition.size(); i++) {
Place place = placeByCondition.get(i); Place place = placeByCondition.get(i);
PlaceP pp = new PlaceP(place); PlaceP pp = new PlaceP(place);
Depository depositoryRecordById = depositoryService.findDepositoryRecordById(place.getDid()); Integer did = place.getDid();
pp.setDepositoryName(depositoryRecordById.getDname()); if(did != 0){
Depository depositoryRecordById = depositoryService.findDepositoryRecordById(did);
pp.setDepositoryName(depositoryRecordById.getDname());
}else{
pp.setDepositoryName("默认库位");
}
placePList.add(pp); placePList.add(pp);
} }
return placePList; return placePList;
@ -205,4 +210,15 @@ public class PlaceServiceImpl implements PlaceService {
return placeMapper.findPlaceAndMaterialByMidAndPid(map); return placeMapper.findPlaceAndMaterialByMidAndPid(map);
} }
/**
* 添加物料到库位
* @param map
* @return
*/
@Override
public Integer addMaterialOnPlace(Map<String, Object> map) {
return placeMapper.addMaterialOnPlace(map);
}
} }

2
src/main/resources/static/js/lay-module/step-lay/step.css

@ -58,7 +58,7 @@
/*margin-left: -20px;*/ /*margin-left: -20px;*/
/*margin-left: -50%;*/ /*margin-left: -50%;*/
/*margin-right: 50%;*/ /*margin-right: 50%;*/
padding-left: 26px; /*padding-left: 26px;*/
text-align: center; text-align: center;
} }

20
src/main/resources/static/vue/common/helper.js

@ -0,0 +1,20 @@
function test (){
console.log('test方法');
}
function IsURL(str_url) {
return (/^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/gm).test(str_url);
}
function AnalysisURL(url) {
return /^(https?:\/\/)([0-9a-z.]+)(:[0-9]+)?([/0-9a-z.]+)?(\?[0-9a-z&=]+)?(#[0-9-a-z]+)?/i.exec(url);
}
const permission = {
test:test,
IsURL:IsURL,
AnalysisURL:AnalysisURL
}
module.exports = permission

245
src/main/resources/static/vue/common/permission.js

@ -0,0 +1,245 @@
/// null = 未请求,1 = 已允许,0 = 拒绝|受限, 2 = 系统未开启
var isIOS
function album() {
var result = 0;
var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
var authStatus = PHPhotoLibrary.authorizationStatus();
if (authStatus === 0) {
result = null;
} else if (authStatus == 3) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(PHPhotoLibrary);
return result;
}
function camera() {
var result = 0;
var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
if (authStatus === 0) {
result = null;
} else if (authStatus == 3) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(AVCaptureDevice);
return result;
}
function location() {
var result = 0;
var cllocationManger = plus.ios.import("CLLocationManager");
var enable = cllocationManger.locationServicesEnabled();
var status = cllocationManger.authorizationStatus();
if (!enable) {
result = 2;
} else if (status === 0) {
result = null;
} else if (status === 3 || status === 4) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(cllocationManger);
return result;
}
function push() {
var result = 0;
var UIApplication = plus.ios.import("UIApplication");
var app = UIApplication.sharedApplication();
var enabledTypes = 0;
if (app.currentUserNotificationSettings) {
var settings = app.currentUserNotificationSettings();
enabledTypes = settings.plusGetAttribute("types");
if (enabledTypes == 0) {
result = 0;
console.log("推送权限没有开启");
} else {
result = 1;
console.log("已经开启推送功能!")
}
plus.ios.deleteObject(settings);
} else {
enabledTypes = app.enabledRemoteNotificationTypes();
if (enabledTypes == 0) {
result = 3;
console.log("推送权限没有开启!");
} else {
result = 4;
console.log("已经开启推送功能!")
}
}
plus.ios.deleteObject(app);
plus.ios.deleteObject(UIApplication);
return result;
}
function contact() {
var result = 0;
var CNContactStore = plus.ios.import("CNContactStore");
var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
if (cnAuthStatus === 0) {
result = null;
} else if (cnAuthStatus == 3) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(CNContactStore);
return result;
}
function record() {
var result = null;
var avaudiosession = plus.ios.import("AVAudioSession");
var avaudio = avaudiosession.sharedInstance();
var status = avaudio.recordPermission();
console.log("permissionStatus:" + status);
if (status === 1970168948) {
result = null;
} else if (status === 1735552628) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(avaudiosession);
return result;
}
function calendar() {
var result = null;
var EKEventStore = plus.ios.import("EKEventStore");
var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
if (ekAuthStatus == 3) {
result = 1;
console.log("日历权限已经开启");
} else {
console.log("日历权限没有开启");
}
plus.ios.deleteObject(EKEventStore);
return result;
}
function memo() {
var result = null;
var EKEventStore = plus.ios.import("EKEventStore");
var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
if (ekAuthStatus == 3) {
result = 1;
console.log("备忘录权限已经开启");
} else {
console.log("备忘录权限没有开启");
}
plus.ios.deleteObject(EKEventStore);
return result;
}
function requestIOS(permissionID) {
return new Promise((resolve, reject) => {
switch (permissionID) {
case "push":
resolve(push());
break;
case "location":
resolve(location());
break;
case "record":
resolve(record());
break;
case "camera":
resolve(camera());
break;
case "album":
resolve(album());
break;
case "contact":
resolve(contact());
break;
case "calendar":
resolve(calendar());
break;
case "memo":
resolve(memo());
break;
default:
resolve(0);
break;
}
});
}
function requestAndroid(permissionID) {
return new Promise((resolve, reject) => {
plus.android.requestPermissions(
[permissionID],
function(resultObj) {
var result = 0;
for (var i = 0; i < resultObj.granted.length; i++) {
var grantedPermission = resultObj.granted[i];
console.log('已获取的权限:' + grantedPermission);
result = 1
}
for (var i = 0; i < resultObj.deniedPresent.length; i++) {
var deniedPresentPermission = resultObj.deniedPresent[i];
console.log('拒绝本次申请的权限:' + deniedPresentPermission);
result = 0
}
for (var i = 0; i < resultObj.deniedAlways.length; i++) {
var deniedAlwaysPermission = resultObj.deniedAlways[i];
console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
result = -1
}
resolve(result);
},
function(error) {
console.log('result error: ' + error.message)
resolve({
code: error.code,
message: error.message
});
}
);
});
}
function gotoAppPermissionSetting() {
if (permission.isIOS) {
var UIApplication = plus.ios.import("UIApplication");
var application2 = UIApplication.sharedApplication();
var NSURL2 = plus.ios.import("NSURL");
var setting2 = NSURL2.URLWithString("app-settings:");
application2.openURL(setting2);
plus.ios.deleteObject(setting2);
plus.ios.deleteObject(NSURL2);
plus.ios.deleteObject(application2);
} else {
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
const permission = {
get isIOS(){
return typeof isIOS === 'boolean' ? isIOS : (isIOS = uni.getSystemInfoSync().platform === 'ios')
},
requestIOS: requestIOS,
requestAndroid: requestAndroid,
gotoAppSetting: gotoAppPermissionSetting
}
module.exports = permission

13
src/main/resources/templates/index.html

@ -137,6 +137,7 @@
<script src="/static/js/lay-config.js?v=2.0.0" charset="utf-8"></script> <script src="/static/js/lay-config.js?v=2.0.0" charset="utf-8"></script>
<script> <script>
layui.use(['jquery', 'layer', 'miniAdmin','miniTongji'], function () { layui.use(['jquery', 'layer', 'miniAdmin','miniTongji'], function () {
var $ = layui.jquery, var $ = layui.jquery,
layer = layui.layer, layer = layui.layer,
@ -158,17 +159,7 @@
$("#scan").on("click",function () { $("#scan").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: '/scanQrCode',
})
}); });

10
src/main/resources/templates/pages/application/form-step-look_back.html

@ -123,19 +123,11 @@
var state=$("#state").text(); var state=$("#state").text();
//当前处于的状态 //当前处于的状态
var position=0,states={},number = 1; var position=0,states={},number = 1;
/*if (state === "待部门负责人审核" || state === "部门负责人审核未通过") {
position = 1;
states = [{title: "提交申请"}, {title: state}, {title: "未入库"}];
} else {
position = 2;
states = [{title: "提交申请"}, {title: "审核通过"}, {title: state}];
}*/
if (state === "待部门负责人审核" || state === "部门负责人审核未通过") { if (state === "待部门负责人审核" || state === "部门负责人审核未通过") {
// , {title: "未入库"}
states = [ {title: state}]; states = [ {title: state}];
number = 2; number = 2;
} else { } else {
// {title: "提交申请"},
states = [ {title: state}]; states = [ {title: state}];
number = 3; number = 3;
} }

1108
src/main/resources/templates/pages/chart/chart-in_back.html

File diff suppressed because it is too large

96
src/main/resources/templates/pages/chart/chart-out_back.html

@ -15,16 +15,19 @@
border-radius: 5px; border-radius: 5px;
text-align: center; text-align: center;
} }
.top-panel > .layui-card-body{
.top-panel > .layui-card-body {
height: 60px; height: 60px;
} }
.top-panel-number{
line-height:60px; .top-panel-number {
line-height: 60px;
font-size: 30px; font-size: 30px;
border-right:1px solid #eceff9; border-right: 1px solid #eceff9;
} }
.top-panel-tips{
line-height:30px; .top-panel-tips {
line-height: 30px;
font-size: 12px font-size: 12px
} }
</style> </style>
@ -114,7 +117,7 @@
<button class="layui-btn" lay-submit lay-filter="thisWeek"> <button class="layui-btn" lay-submit lay-filter="thisWeek">
&emsp;本周&emsp; &emsp;本周&emsp;
</button> </button>
<button class="layui-btn" lay-submit lay-filter="lastWeek" > <button class="layui-btn" lay-submit lay-filter="lastWeek">
&emsp;上周&emsp; &emsp;上周&emsp;
</button> </button>
<div id="echarts-records" style="background-color:#ffffff;min-height:400px;padding: 10px"></div> <div id="echarts-records" style="background-color:#ffffff;min-height:400px;padding: 10px"></div>
@ -142,7 +145,7 @@
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script> <script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script> <script>
layui.use(['layer', 'echarts'], function () { layui.use(['layer', 'echarts'], function () {
var $ = layui.jquery, var $ = layui.jquery,
layer = layui.layer, layer = layui.layer,
echarts = layui.echarts, echarts = layui.echarts,
form = layui.form; form = layui.form;
@ -260,8 +263,7 @@
tooltip: {}, tooltip: {},
dataset: { dataset: {
dimensions: [], dimensions: [],
source: [ source: []
]
}, },
xAxis: {type: 'category'}, xAxis: {type: 'category'},
yAxis: {}, yAxis: {},
@ -284,8 +286,7 @@
showContent: false showContent: false
}, },
dataset: { dataset: {
source: [ source: []
]
}, },
xAxis: {type: 'category'}, xAxis: {type: 'category'},
yAxis: {gridIndex: 0}, yAxis: {gridIndex: 0},
@ -312,17 +313,21 @@
//动态加载相关数据 //动态加载相关数据
$.ajax({ $.ajax({
url:'/repository/layui/echart_back?type=2', url: '/repository/layui/echart_back?type=2',
type:'get', type: 'get',
async:true, async: true,
dataType: "json", dataType: "json",
complete:function (XHR,TS){ complete: function (XHR, TS) {
if(XHR.status != 200){ if (XHR.status !== 200) {
layer.alert("系统繁忙,稍后重试"); layer.alert("系统繁忙,稍后重试");
} }
}, },
success:function (result){ beforeSend: function () {
if(result.code == 0){ this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (result) {
layer.close(this.layerIndex);
if (result.code === 0) {
echartsRecords.setOption(optionRecords); echartsRecords.setOption(optionRecords);
echartsPies.setOption(optionPies); echartsPies.setOption(optionPies);
echartsDataset.setOption(optionDataset); echartsDataset.setOption(optionDataset);
@ -330,7 +335,7 @@
console.log(result) console.log(result)
// 折线图 // 折线图
var optionRecordsSeries=[]; var optionRecordsSeries = [];
// 饼状图 // 饼状图
var optionPiesSeries = { var optionPiesSeries = {
name: '昨日占比', name: '昨日占比',
@ -345,28 +350,29 @@
shadowColor: 'rgba(0, 0, 0, 0.5)' shadowColor: 'rgba(0, 0, 0, 0.5)'
} }
}, },
data:[] data: []
} }
// 柱状图 // 柱状图
optionDataset = { optionDataset = {
legend: {}, legend: {},
tooltip: {}, tooltip: {},
dataset: { dataset: {
dimensions:[], dimensions: [],
source:[] source: []
}, },
series:[] series: []
}; };
for (let i = 0; i < result.data.depository_name.length; i++) { for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({ optionRecordsSeries.push({
name: result.data.depository_name[i], name: result.data.depository_name[i],
type: 'line', type: 'line',
stack: '金额', stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]], data: result.data.depository_data.data[result.data.depository_name[i]],
areaStyle: {} areaStyle: {}
}); });
optionPiesSeries.data.push({ optionPiesSeries.data.push({
value:result.data.depository_data.yesterdayData[result.data.depository_name[i]],name:result.data.depository_name[i] value: result.data.depository_data.yesterdayData[result.data.depository_name[i]],
name: result.data.depository_name[i]
}) })
} }
var dimensions = result.data.depository_data.sourceList[result.data.depository_data.sourceList.length - 1] var dimensions = result.data.depository_data.sourceList[result.data.depository_data.sourceList.length - 1]
@ -375,10 +381,10 @@
optionDataset.dataset.source.push(result.data.depository_data.sourceList[i]) optionDataset.dataset.source.push(result.data.depository_data.sourceList[i])
} }
for (let i = 0; i < dimensions.length - 1; i++) { for (let i = 0; i < dimensions.length - 1; i++) {
optionDataset.series.push({type:'bar'}) optionDataset.series.push({type: 'bar'})
} }
for (let i = 0; i < result.data.depository_data.mapData.mapDataList.length ; i++) { for (let i = 0; i < result.data.depository_data.mapData.mapDataList.length; i++) {
optionMap.dataset.source.push(result.data.depository_data.mapData.mapDataList[i]) optionMap.dataset.source.push(result.data.depository_data.mapData.mapDataList[i])
optionMap.series.push({type: 'line', smooth: true, seriesLayoutBy: 'row'}) optionMap.series.push({type: 'line', smooth: true, seriesLayoutBy: 'row'})
@ -402,7 +408,6 @@
) )
optionRecords = { optionRecords = {
title: { title: {
text: '出库仓库-报表图' text: '出库仓库-报表图'
@ -475,28 +480,27 @@
} }
form.on('submit(thisWeek)', function () { form.on('submit(thisWeek)', function () {
$.ajax({ $.ajax({
url:'/repository/layui/echart_back?type=2', url: '/repository/layui/echart_back?type=2',
type:'get', type: 'get',
async:true, async: true,
dataType: "json", dataType: "json",
complete:function (XHR,TS){ complete: function (XHR, TS) {
if(XHR.status != 200){ if (XHR.status != 200) {
layer.alert("系统繁忙,稍后重试"); layer.alert("系统繁忙,稍后重试");
} }
}, },
success:function (result){ success: function (result) {
echartsRecords.setOption(optionRecords); echartsRecords.setOption(optionRecords);
// 折线图 // 折线图
var optionRecordsSeries=[]; var optionRecordsSeries = [];
for (let i = 0; i < result.data.depository_name.length; i++) { for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({ optionRecordsSeries.push({
name: result.data.depository_name[i], name: result.data.depository_name[i],
type: 'line', type: 'line',
stack: '金额', stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]], data: result.data.depository_data.data[result.data.depository_name[i]],
areaStyle: {} areaStyle: {}
}); });
} }
@ -548,25 +552,25 @@
form.on('submit(lastWeek)', function () { form.on('submit(lastWeek)', function () {
$.ajax({ $.ajax({
url:'/repository/layui/echart_back?type=2&last=1', url: '/repository/layui/echart_back?type=2&last=1',
type:'get', type: 'get',
async:true, async: true,
dataType: "json", dataType: "json",
complete:function (XHR,TS){ complete: function (XHR, TS) {
if(XHR.status != 200){ if (XHR.status != 200) {
layer.alert("系统繁忙,稍后重试"); layer.alert("系统繁忙,稍后重试");
} }
}, },
success:function (result){ success: function (result) {
echartsRecords.setOption(optionRecords); echartsRecords.setOption(optionRecords);
// 折线图 // 折线图
var optionRecordsSeries=[]; var optionRecordsSeries = [];
for (let i = 0; i < result.data.depository_name.length; i++) { for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({ optionRecordsSeries.push({
name: result.data.depository_name[i], name: result.data.depository_name[i],
type: 'line', type: 'line',
stack: '金额', stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]], data: result.data.depository_data.data[result.data.depository_name[i]],
areaStyle: {} areaStyle: {}
}); });
} }

315
src/main/resources/templates/pages/uniApp/scanQrCode.html

@ -1,315 +0,0 @@
<template>
<div class="page-scan">
<div class="base-line">
<div class="pullWrap">
<div class="topTitle">
<div class="pullTitle">
<div class="pullName">二维码绑定</div>
<!-- 绑定状态图标 -->
<img class="left-icon" src="/static/img/noBind.svg" alt="" v-if="!dataObj.qrCodeId">
<img class="left-icon" src="/static/img/binded.svg" alt="" v-else>
<div class="right-part">
<input :disabled="dataObj.qrCodeId" type="text" v-model="dataObj.qrCodeId" placeholder="请输入二维码ID" v-if="dataObj.qrCodeId">
<input type="text" v-model="scanTextData.scanText" placeholder="请输入二维码ID" v-else>
<img src="/static/img/scan.svg" alt="" v-if="!dataObj.qrCodeId">
<span @click="toScanCode" v-if="!dataObj.qrCodeId">扫码填入</span>
<span v-if="dataObj.qrCodeId">解绑</span>
</div>
</div>
</div>
</div>
</div>
<!-- 扫描盒子 -->
<div class="scan-box" v-if="scanTextData.showScanBox">
<div class="scan-cacel" @click="cancelScan" v-show="scanTextData.showScanBoxInfo">
<!-- <img src="" alt=""> -->
取消
</div>
<video ref="video" id="video" class="scan-video" v-show="scanTextData.showScanBoxInfo" autoplay></video>
<div class="scan-img" v-show="scanTextData.showScanBoxInfo">
<div class="scan-frame">
<span class="left-t"></span>
<span class="right-t"></span>
<span class="left-b"></span>
<span class="right-b"></span>
<span class="cross-line"></span>
</div>
</div>
<!-- <img src="/static/img/scan.svg" alt="" v-show="scanTextData.showScanBoxInfo"> -->
<div class="scan-tip" v-show="scanTextData.showScanBoxInfo"> {{scanTextData.tipMsg}} </div>
</div>
</div>
</template>
<script>
import { BrowserMultiFormatReader } from '@zxing/library';
let scanTextData = {
loadingShow: false,
codeReader: null,
scanText: '',
vin: null,
tipMsg: '将二维码置于屏幕中,即可识别',
tipShow: false
}
export default {
name: 'scanCodePage',
data() {
return {
scanTextData:{
loadingShow: false,
codeReader: null,
scanText: '',
vin: null,
tipMsg: '将二维码置于屏幕中,即可识别',
tipShow: false,
showScanBox:false,
showScanBoxInfo:false,
},
hasBind:false
}
},
methods: {
toScanCode(){
console.log('识别二维码',this.dataObj)
scanTextData.codeReader = new BrowserMultiFormatReader();
this.scanTextData.showScanBox = true
this.openScan();
},
cancelScan(){
//识别完停止使用摄像头
let thisVideo = document.getElementById("video");
thisVideo.srcObject.getTracks()[0].stop()
scanTextData.codeReader.reset(); // 重置
this.scanTextData.showScanBox = false
setTimeout(()=>{
this.scanTextData.showScanBoxInfo = false
},1000)
},
async openScan() {
scanTextData.codeReader.getVideoInputDevices().then((videoInputDevices) => {
scanTextData.tipShow = true;
scanTextData.tipMsg = '正在调用摄像头...';
console.log('videoInputDevices', videoInputDevices);
// 默认获取第一个摄像头设备id
let firstDeviceId = videoInputDevices[0].deviceId;
// 获取第一个摄像头设备的名称
const videoInputDeviceslablestr = JSON.stringify(videoInputDevices[0].label);
if (videoInputDevices.length > 1) {
// 判断是否后置摄像头
if (videoInputDeviceslablestr.indexOf('back') > -1) {
firstDeviceId = videoInputDevices[0].deviceId;
} else {
firstDeviceId = videoInputDevices[1].deviceId;
}
}
this.decodeFromInputVideoFunc(firstDeviceId);
}).catch(err => {
scanTextData.tipShow = false;
console.error(err);
});
},
decodeFromInputVideoFunc(firstDeviceId) {
scanTextData.codeReader.reset(); // 重置
scanTextData.scanText = '';
scanTextData.codeReader.decodeFromInputVideoDeviceContinuously(firstDeviceId, 'video', (result, err) => {
scanTextData.tipMsg = '将二维码置于屏幕中,即可识别';
scanTextData.scanText = '';
setTimeout(()=>{
this.scanTextData.showScanBoxInfo = true
},1000)
if (result) {
console.log('扫描结果', result.text);
if (result.text) {
console.log('扫描结果11', result.text);
this.scanTextData.showScanBox = false
this.scanTextData.showScanBoxInfo = false
this.scanTextData.scanText = result.text
//这里扫描出结果可以调用你想要的方法
//识别完停止使用摄像头
let thisVideo = document.getElementById("video");
thisVideo.srcObject.getTracks()[0].stop()
scanTextData.codeReader.reset(); // 重置
}
}else{
// console.log('没出来?',result,err)
}
if (err && !(err)) {
scanTextData.tipMsg = '识别失败';
setTimeout(() => {
scanTextData.tipShow = false;
}, 2000)
console.error(err);
}
});
},
},
props:['dataObj']
}
</script>
<style scoped lang="scss">
.pullWrap {
width: 100%;
height: 100px;
padding-top: 50px;
background: #fff;
}
.topTitle {
width: 100%;
position: relative;
}
.pullTitle {
display: flex;
height: 80px;
line-height: 80px;
margin-top: -40px;
background: #fff;
align-items: center;
justify-content: space-between;
}
.pullName{
font-size: 30px;
color: rgba(0,0,0,0.85);
}
img{
width: 40px;
height: 40px;
}
.left-icon{
margin:0 15px;
}
span{
text-decoration: underline;
text-decoration-color: #42a5ff;
color: #42a5ff;
margin-left: 5px;
}
.right-part {
flex: 1;
display: flex;
align-items: center;
justify-content: space-around;
border-bottom: 1px solid #e5e5e5;
overflow: hidden;
text-overflow: ellipsis;
}
input{
border:none;
flex: 1;
}
.scan-index-bar{
background-image: linear-gradient( -45deg, #42a5ff ,#59cfff);
}
.van-nav-bar__title{
color: #fff !important;
}
.scan-box {
position: fixed;
top: 0;
left: 0;
z-index: 5;
height: 100%;
width: 100vw;
}
.scan-cacel{
position: absolute;
top: 30px;
left: 30px;
z-index: 9;
color: #fff;
font-size: 35px;
}
.scan-video{
height: 100vh;
width: 100vw;
object-fit:cover;
}
.scan-img {
width: 500px;
height: 500px;
position: fixed;
top: 40%;
left: 50%;
margin-top: -200px;
margin-left: -250px;
z-index: 6;
}
.scan-frame {
width: 100%;
height: 100%;
position: relative;
}
.left-t,.right-t,.left-b,.right-b{
position: absolute;
width: 80px;
height: 80px;
}
.left-t{
top: 0;
left: 0;
border-top:2px solid #17B1B7;
border-left:2px solid #17B1B7;
}
.right-t{
top: 0;
right: 0;
border-top:2px solid #17B1B7;
border-right:2px solid #17B1B7;
}
.left-b{
bottom: 0;
left: 0;
border-bottom:2px solid #17B1B7;
border-left:2px solid #17B1B7;
}
.right-b{
bottom: 0;
right: 0;
border-bottom:2px solid #17B1B7;
border-right:2px solid #17B1B7;
}
.cross-line{
width: 600px;
height: 10px;
background: linear-gradient(to right, rgba(255, 255, 255, 0),#5DDDD3,rgba(255,255,255,0));
position: absolute;
top: 0;
left: -50px;
animation: identifier_p 5s infinite;
}
@keyframes identifier_p {
0%{
top: 0%;
}
50%{
top: 100%;
}
100%{
top: 0;
}
}
.scan-tip{
width: 100vw;
text-align: center;
margin-bottom: 10vh;
color: white;
font-size: 5vw;
position: absolute;
bottom: 50px;
left: 0;
color: #fff;
}
.page-scan{
overflow-y: hidden;
// background-color: #363636;
}
</style>

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

@ -13,6 +13,7 @@ import com.dreamchaser.depository_manage.service.MaterialService;
import com.dreamchaser.depository_manage.service.MaterialTypeService; import com.dreamchaser.depository_manage.service.MaterialTypeService;
import com.dreamchaser.depository_manage.utils.*; import com.dreamchaser.depository_manage.utils.*;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.joda.time.DateTimeUtils;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.redisson.api.RLock; import org.redisson.api.RLock;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
@ -30,8 +31,9 @@ import java.util.concurrent.TimeUnit;
public class Test { public class Test {
@org.junit.Test
public void test1(){ public void test1(){
System.out.println(DateUtil.TimeStampToDateTime(Long.valueOf("1664035200000")));
} }

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

@ -124,6 +124,7 @@
<if test="code != null and code != '' "> <if test="code != null and code != '' ">
and code = #{code} and code = #{code}
</if> </if>
and depository_id is null
<if test="begin != null and size != null"> <if test="begin != null and size != null">
LIMIT #{begin},#{size} LIMIT #{begin},#{size}
</if> </if>
@ -165,6 +166,38 @@
</if> </if>
</select> </select>
<select id="findInventoryCount" parameterType="map" resultType="int">
SELECT
count(*)
from findMaterial
where 1 = 1
<if test="mid != null">
and id = #{mid}
</if>
<if test="depositoryId != null">
AND depository_id = #{depositoryId}
</if>
<if test="mname != null and mname != ''">
AND mname LIKE CONCAT('%', #{mname}, '%')
</if>
<if test="quantity != null">
AND quantity = #{quantity}
</if>
<if test="price != null">
AND price = #{price}
</if>
<if test="materialTypeId != null">
AND type_id = #{materialTypeId}
</if>
<if test="state != null and state != ''">
And state = #{state}
</if>
<if test="code != null and code != '' ">
and code = #{code}
</if>
and depository_id is not null
</select>
<!-- 根据仓库查询物料--> <!-- 根据仓库查询物料-->
<select id="findMaterialByDepositorys" resultMap="materialMap" parameterType="list"> <select id="findMaterialByDepositorys" resultMap="materialMap" parameterType="list">
SELECT SELECT
@ -176,6 +209,13 @@
#{item} #{item}
</foreach> </foreach>
</select> </select>
<!-- 根据仓库查询物料-->
<select id="findMaterialByDepository" resultMap="materialMap" parameterType="int">
SELECT
<include refid="allColumns" />
from material m
where m.depository_id = #{depositoryId}
</select>
<!-- 根据主键查询数据 --> <!-- 根据主键查询数据 -->

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

@ -53,12 +53,13 @@
<include refid="allColumns" /> <include refid="allColumns" />
from materialandplace mp left join place p on p.id = mp.pid from materialandplace mp left join place p on p.id = mp.pid
where 1 = 1 where 1 = 1
<if test="did != null and did != ''">
and p.did = #{did}
</if>
<if test="mid != null and mid != ''"> <if test="mid != null and mid != ''">
and mp.mid = #{mid} and mp.mid = #{mid}
</if> </if>
<if test="did != null and did != ''">
and ( p.did = #{did} or p.did = 0)
</if>
</select> </select>
<!-- 根据条件参数查询列表 --> <!-- 根据条件参数查询列表 -->

2
target/classes/static/js/lay-module/step-lay/step.css

@ -58,7 +58,7 @@
/*margin-left: -20px;*/ /*margin-left: -20px;*/
/*margin-left: -50%;*/ /*margin-left: -50%;*/
/*margin-right: 50%;*/ /*margin-right: 50%;*/
padding-left: 26px; /*padding-left: 26px;*/
text-align: center; text-align: center;
} }

13
target/classes/templates/index.html

@ -137,6 +137,7 @@
<script src="/static/js/lay-config.js?v=2.0.0" charset="utf-8"></script> <script src="/static/js/lay-config.js?v=2.0.0" charset="utf-8"></script>
<script> <script>
layui.use(['jquery', 'layer', 'miniAdmin','miniTongji'], function () { layui.use(['jquery', 'layer', 'miniAdmin','miniTongji'], function () {
var $ = layui.jquery, var $ = layui.jquery,
layer = layui.layer, layer = layui.layer,
@ -158,17 +159,7 @@
$("#scan").on("click",function () { $("#scan").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: '/scanQrCode',
})
}); });

10
target/classes/templates/pages/application/form-step-look_back.html

@ -123,19 +123,11 @@
var state=$("#state").text(); var state=$("#state").text();
//当前处于的状态 //当前处于的状态
var position=0,states={},number = 1; var position=0,states={},number = 1;
/*if (state === "待部门负责人审核" || state === "部门负责人审核未通过") {
position = 1;
states = [{title: "提交申请"}, {title: state}, {title: "未入库"}];
} else {
position = 2;
states = [{title: "提交申请"}, {title: "审核通过"}, {title: state}];
}*/
if (state === "待部门负责人审核" || state === "部门负责人审核未通过") { if (state === "待部门负责人审核" || state === "部门负责人审核未通过") {
// , {title: "未入库"}
states = [ {title: state}]; states = [ {title: state}];
number = 2; number = 2;
} else { } else {
// {title: "提交申请"},
states = [ {title: state}]; states = [ {title: state}];
number = 3; number = 3;
} }

1108
target/classes/templates/pages/chart/chart-in_back.html

File diff suppressed because it is too large

96
target/classes/templates/pages/chart/chart-out_back.html

@ -15,16 +15,19 @@
border-radius: 5px; border-radius: 5px;
text-align: center; text-align: center;
} }
.top-panel > .layui-card-body{
.top-panel > .layui-card-body {
height: 60px; height: 60px;
} }
.top-panel-number{
line-height:60px; .top-panel-number {
line-height: 60px;
font-size: 30px; font-size: 30px;
border-right:1px solid #eceff9; border-right: 1px solid #eceff9;
} }
.top-panel-tips{
line-height:30px; .top-panel-tips {
line-height: 30px;
font-size: 12px font-size: 12px
} }
</style> </style>
@ -114,7 +117,7 @@
<button class="layui-btn" lay-submit lay-filter="thisWeek"> <button class="layui-btn" lay-submit lay-filter="thisWeek">
&emsp;本周&emsp; &emsp;本周&emsp;
</button> </button>
<button class="layui-btn" lay-submit lay-filter="lastWeek" > <button class="layui-btn" lay-submit lay-filter="lastWeek">
&emsp;上周&emsp; &emsp;上周&emsp;
</button> </button>
<div id="echarts-records" style="background-color:#ffffff;min-height:400px;padding: 10px"></div> <div id="echarts-records" style="background-color:#ffffff;min-height:400px;padding: 10px"></div>
@ -142,7 +145,7 @@
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script> <script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script> <script>
layui.use(['layer', 'echarts'], function () { layui.use(['layer', 'echarts'], function () {
var $ = layui.jquery, var $ = layui.jquery,
layer = layui.layer, layer = layui.layer,
echarts = layui.echarts, echarts = layui.echarts,
form = layui.form; form = layui.form;
@ -260,8 +263,7 @@
tooltip: {}, tooltip: {},
dataset: { dataset: {
dimensions: [], dimensions: [],
source: [ source: []
]
}, },
xAxis: {type: 'category'}, xAxis: {type: 'category'},
yAxis: {}, yAxis: {},
@ -284,8 +286,7 @@
showContent: false showContent: false
}, },
dataset: { dataset: {
source: [ source: []
]
}, },
xAxis: {type: 'category'}, xAxis: {type: 'category'},
yAxis: {gridIndex: 0}, yAxis: {gridIndex: 0},
@ -312,17 +313,21 @@
//动态加载相关数据 //动态加载相关数据
$.ajax({ $.ajax({
url:'/repository/layui/echart_back?type=2', url: '/repository/layui/echart_back?type=2',
type:'get', type: 'get',
async:true, async: true,
dataType: "json", dataType: "json",
complete:function (XHR,TS){ complete: function (XHR, TS) {
if(XHR.status != 200){ if (XHR.status !== 200) {
layer.alert("系统繁忙,稍后重试"); layer.alert("系统繁忙,稍后重试");
} }
}, },
success:function (result){ beforeSend: function () {
if(result.code == 0){ this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (result) {
layer.close(this.layerIndex);
if (result.code === 0) {
echartsRecords.setOption(optionRecords); echartsRecords.setOption(optionRecords);
echartsPies.setOption(optionPies); echartsPies.setOption(optionPies);
echartsDataset.setOption(optionDataset); echartsDataset.setOption(optionDataset);
@ -330,7 +335,7 @@
console.log(result) console.log(result)
// 折线图 // 折线图
var optionRecordsSeries=[]; var optionRecordsSeries = [];
// 饼状图 // 饼状图
var optionPiesSeries = { var optionPiesSeries = {
name: '昨日占比', name: '昨日占比',
@ -345,28 +350,29 @@
shadowColor: 'rgba(0, 0, 0, 0.5)' shadowColor: 'rgba(0, 0, 0, 0.5)'
} }
}, },
data:[] data: []
} }
// 柱状图 // 柱状图
optionDataset = { optionDataset = {
legend: {}, legend: {},
tooltip: {}, tooltip: {},
dataset: { dataset: {
dimensions:[], dimensions: [],
source:[] source: []
}, },
series:[] series: []
}; };
for (let i = 0; i < result.data.depository_name.length; i++) { for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({ optionRecordsSeries.push({
name: result.data.depository_name[i], name: result.data.depository_name[i],
type: 'line', type: 'line',
stack: '金额', stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]], data: result.data.depository_data.data[result.data.depository_name[i]],
areaStyle: {} areaStyle: {}
}); });
optionPiesSeries.data.push({ optionPiesSeries.data.push({
value:result.data.depository_data.yesterdayData[result.data.depository_name[i]],name:result.data.depository_name[i] value: result.data.depository_data.yesterdayData[result.data.depository_name[i]],
name: result.data.depository_name[i]
}) })
} }
var dimensions = result.data.depository_data.sourceList[result.data.depository_data.sourceList.length - 1] var dimensions = result.data.depository_data.sourceList[result.data.depository_data.sourceList.length - 1]
@ -375,10 +381,10 @@
optionDataset.dataset.source.push(result.data.depository_data.sourceList[i]) optionDataset.dataset.source.push(result.data.depository_data.sourceList[i])
} }
for (let i = 0; i < dimensions.length - 1; i++) { for (let i = 0; i < dimensions.length - 1; i++) {
optionDataset.series.push({type:'bar'}) optionDataset.series.push({type: 'bar'})
} }
for (let i = 0; i < result.data.depository_data.mapData.mapDataList.length ; i++) { for (let i = 0; i < result.data.depository_data.mapData.mapDataList.length; i++) {
optionMap.dataset.source.push(result.data.depository_data.mapData.mapDataList[i]) optionMap.dataset.source.push(result.data.depository_data.mapData.mapDataList[i])
optionMap.series.push({type: 'line', smooth: true, seriesLayoutBy: 'row'}) optionMap.series.push({type: 'line', smooth: true, seriesLayoutBy: 'row'})
@ -402,7 +408,6 @@
) )
optionRecords = { optionRecords = {
title: { title: {
text: '出库仓库-报表图' text: '出库仓库-报表图'
@ -475,28 +480,27 @@
} }
form.on('submit(thisWeek)', function () { form.on('submit(thisWeek)', function () {
$.ajax({ $.ajax({
url:'/repository/layui/echart_back?type=2', url: '/repository/layui/echart_back?type=2',
type:'get', type: 'get',
async:true, async: true,
dataType: "json", dataType: "json",
complete:function (XHR,TS){ complete: function (XHR, TS) {
if(XHR.status != 200){ if (XHR.status != 200) {
layer.alert("系统繁忙,稍后重试"); layer.alert("系统繁忙,稍后重试");
} }
}, },
success:function (result){ success: function (result) {
echartsRecords.setOption(optionRecords); echartsRecords.setOption(optionRecords);
// 折线图 // 折线图
var optionRecordsSeries=[]; var optionRecordsSeries = [];
for (let i = 0; i < result.data.depository_name.length; i++) { for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({ optionRecordsSeries.push({
name: result.data.depository_name[i], name: result.data.depository_name[i],
type: 'line', type: 'line',
stack: '金额', stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]], data: result.data.depository_data.data[result.data.depository_name[i]],
areaStyle: {} areaStyle: {}
}); });
} }
@ -548,25 +552,25 @@
form.on('submit(lastWeek)', function () { form.on('submit(lastWeek)', function () {
$.ajax({ $.ajax({
url:'/repository/layui/echart_back?type=2&last=1', url: '/repository/layui/echart_back?type=2&last=1',
type:'get', type: 'get',
async:true, async: true,
dataType: "json", dataType: "json",
complete:function (XHR,TS){ complete: function (XHR, TS) {
if(XHR.status != 200){ if (XHR.status != 200) {
layer.alert("系统繁忙,稍后重试"); layer.alert("系统繁忙,稍后重试");
} }
}, },
success:function (result){ success: function (result) {
echartsRecords.setOption(optionRecords); echartsRecords.setOption(optionRecords);
// 折线图 // 折线图
var optionRecordsSeries=[]; var optionRecordsSeries = [];
for (let i = 0; i < result.data.depository_name.length; i++) { for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({ optionRecordsSeries.push({
name: result.data.depository_name[i], name: result.data.depository_name[i],
type: 'line', type: 'line',
stack: '金额', stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]], data: result.data.depository_data.data[result.data.depository_name[i]],
areaStyle: {} areaStyle: {}
}); });
} }

315
target/classes/templates/pages/uniApp/scanQrCode.html

@ -1,315 +0,0 @@
<template>
<div class="page-scan">
<div class="base-line">
<div class="pullWrap">
<div class="topTitle">
<div class="pullTitle">
<div class="pullName">二维码绑定</div>
<!-- 绑定状态图标 -->
<img class="left-icon" src="/static/img/noBind.svg" alt="" v-if="!dataObj.qrCodeId">
<img class="left-icon" src="/static/img/binded.svg" alt="" v-else>
<div class="right-part">
<input :disabled="dataObj.qrCodeId" type="text" v-model="dataObj.qrCodeId" placeholder="请输入二维码ID" v-if="dataObj.qrCodeId">
<input type="text" v-model="scanTextData.scanText" placeholder="请输入二维码ID" v-else>
<img src="/static/img/scan.svg" alt="" v-if="!dataObj.qrCodeId">
<span @click="toScanCode" v-if="!dataObj.qrCodeId">扫码填入</span>
<span v-if="dataObj.qrCodeId">解绑</span>
</div>
</div>
</div>
</div>
</div>
<!-- 扫描盒子 -->
<div class="scan-box" v-if="scanTextData.showScanBox">
<div class="scan-cacel" @click="cancelScan" v-show="scanTextData.showScanBoxInfo">
<!-- <img src="" alt=""> -->
取消
</div>
<video ref="video" id="video" class="scan-video" v-show="scanTextData.showScanBoxInfo" autoplay></video>
<div class="scan-img" v-show="scanTextData.showScanBoxInfo">
<div class="scan-frame">
<span class="left-t"></span>
<span class="right-t"></span>
<span class="left-b"></span>
<span class="right-b"></span>
<span class="cross-line"></span>
</div>
</div>
<!-- <img src="/static/img/scan.svg" alt="" v-show="scanTextData.showScanBoxInfo"> -->
<div class="scan-tip" v-show="scanTextData.showScanBoxInfo"> {{scanTextData.tipMsg}} </div>
</div>
</div>
</template>
<script>
import { BrowserMultiFormatReader } from '@zxing/library';
let scanTextData = {
loadingShow: false,
codeReader: null,
scanText: '',
vin: null,
tipMsg: '将二维码置于屏幕中,即可识别',
tipShow: false
}
export default {
name: 'scanCodePage',
data() {
return {
scanTextData:{
loadingShow: false,
codeReader: null,
scanText: '',
vin: null,
tipMsg: '将二维码置于屏幕中,即可识别',
tipShow: false,
showScanBox:false,
showScanBoxInfo:false,
},
hasBind:false
}
},
methods: {
toScanCode(){
console.log('识别二维码',this.dataObj)
scanTextData.codeReader = new BrowserMultiFormatReader();
this.scanTextData.showScanBox = true
this.openScan();
},
cancelScan(){
//识别完停止使用摄像头
let thisVideo = document.getElementById("video");
thisVideo.srcObject.getTracks()[0].stop()
scanTextData.codeReader.reset(); // 重置
this.scanTextData.showScanBox = false
setTimeout(()=>{
this.scanTextData.showScanBoxInfo = false
},1000)
},
async openScan() {
scanTextData.codeReader.getVideoInputDevices().then((videoInputDevices) => {
scanTextData.tipShow = true;
scanTextData.tipMsg = '正在调用摄像头...';
console.log('videoInputDevices', videoInputDevices);
// 默认获取第一个摄像头设备id
let firstDeviceId = videoInputDevices[0].deviceId;
// 获取第一个摄像头设备的名称
const videoInputDeviceslablestr = JSON.stringify(videoInputDevices[0].label);
if (videoInputDevices.length > 1) {
// 判断是否后置摄像头
if (videoInputDeviceslablestr.indexOf('back') > -1) {
firstDeviceId = videoInputDevices[0].deviceId;
} else {
firstDeviceId = videoInputDevices[1].deviceId;
}
}
this.decodeFromInputVideoFunc(firstDeviceId);
}).catch(err => {
scanTextData.tipShow = false;
console.error(err);
});
},
decodeFromInputVideoFunc(firstDeviceId) {
scanTextData.codeReader.reset(); // 重置
scanTextData.scanText = '';
scanTextData.codeReader.decodeFromInputVideoDeviceContinuously(firstDeviceId, 'video', (result, err) => {
scanTextData.tipMsg = '将二维码置于屏幕中,即可识别';
scanTextData.scanText = '';
setTimeout(()=>{
this.scanTextData.showScanBoxInfo = true
},1000)
if (result) {
console.log('扫描结果', result.text);
if (result.text) {
console.log('扫描结果11', result.text);
this.scanTextData.showScanBox = false
this.scanTextData.showScanBoxInfo = false
this.scanTextData.scanText = result.text
//这里扫描出结果可以调用你想要的方法
//识别完停止使用摄像头
let thisVideo = document.getElementById("video");
thisVideo.srcObject.getTracks()[0].stop()
scanTextData.codeReader.reset(); // 重置
}
}else{
// console.log('没出来?',result,err)
}
if (err && !(err)) {
scanTextData.tipMsg = '识别失败';
setTimeout(() => {
scanTextData.tipShow = false;
}, 2000)
console.error(err);
}
});
},
},
props:['dataObj']
}
</script>
<style scoped lang="scss">
.pullWrap {
width: 100%;
height: 100px;
padding-top: 50px;
background: #fff;
}
.topTitle {
width: 100%;
position: relative;
}
.pullTitle {
display: flex;
height: 80px;
line-height: 80px;
margin-top: -40px;
background: #fff;
align-items: center;
justify-content: space-between;
}
.pullName{
font-size: 30px;
color: rgba(0,0,0,0.85);
}
img{
width: 40px;
height: 40px;
}
.left-icon{
margin:0 15px;
}
span{
text-decoration: underline;
text-decoration-color: #42a5ff;
color: #42a5ff;
margin-left: 5px;
}
.right-part {
flex: 1;
display: flex;
align-items: center;
justify-content: space-around;
border-bottom: 1px solid #e5e5e5;
overflow: hidden;
text-overflow: ellipsis;
}
input{
border:none;
flex: 1;
}
.scan-index-bar{
background-image: linear-gradient( -45deg, #42a5ff ,#59cfff);
}
.van-nav-bar__title{
color: #fff !important;
}
.scan-box {
position: fixed;
top: 0;
left: 0;
z-index: 5;
height: 100%;
width: 100vw;
}
.scan-cacel{
position: absolute;
top: 30px;
left: 30px;
z-index: 9;
color: #fff;
font-size: 35px;
}
.scan-video{
height: 100vh;
width: 100vw;
object-fit:cover;
}
.scan-img {
width: 500px;
height: 500px;
position: fixed;
top: 40%;
left: 50%;
margin-top: -200px;
margin-left: -250px;
z-index: 6;
}
.scan-frame {
width: 100%;
height: 100%;
position: relative;
}
.left-t,.right-t,.left-b,.right-b{
position: absolute;
width: 80px;
height: 80px;
}
.left-t{
top: 0;
left: 0;
border-top:2px solid #17B1B7;
border-left:2px solid #17B1B7;
}
.right-t{
top: 0;
right: 0;
border-top:2px solid #17B1B7;
border-right:2px solid #17B1B7;
}
.left-b{
bottom: 0;
left: 0;
border-bottom:2px solid #17B1B7;
border-left:2px solid #17B1B7;
}
.right-b{
bottom: 0;
right: 0;
border-bottom:2px solid #17B1B7;
border-right:2px solid #17B1B7;
}
.cross-line{
width: 600px;
height: 10px;
background: linear-gradient(to right, rgba(255, 255, 255, 0),#5DDDD3,rgba(255,255,255,0));
position: absolute;
top: 0;
left: -50px;
animation: identifier_p 5s infinite;
}
@keyframes identifier_p {
0%{
top: 0%;
}
50%{
top: 100%;
}
100%{
top: 0;
}
}
.scan-tip{
width: 100vw;
text-align: center;
margin-bottom: 10vh;
color: white;
font-size: 5vw;
position: absolute;
bottom: 50px;
left: 0;
color: #fff;
}
.page-scan{
overflow-y: hidden;
// background-color: #363636;
}
</style>
Loading…
Cancel
Save