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) {
// 获取库位id
Integer placeId = ObjectFormatUtil.toInteger(map.get("placeId"));
if(placeId == -1) {// 如果插入到仓库
if(placeId == 0) {// 如果插入到仓库
map.put("placeId",0); // 到默认库位
integer += depositoryRecordService.applicationInPlace(map);
}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){
UserByPort userToken= (UserByPort) request.getAttribute("userToken");
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<>();
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 (MaterialP materialP : materialPByCondition) {
if (Objects.equals(materialP.getDepositoryId(), roleAndDepository.getDepositoryId())) {
list.add(materialP);
}
}
List<MaterialP> materialByDepository = materialService.findMaterialByDepository(roleAndDepository.getDepositoryId());
list.addAll(materialByDepository);
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)) {
for (int i = 0; i < depositoryByAdminorg.size(); i++) {
param.put("depositoryId", depositoryByAdminorg.get(i).getId());
materialPByCondition = materialService.findMaterialPByCondition(param);
materialPByCondition = materialService.findInventory(param);
if (materialPByCondition.size() > 0) {
break;
}

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

@ -643,14 +643,6 @@ public class PageController {
public ModelAndView chart_in_back() {
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/chart/chart-in_back");
/**
* 仓库总数
*/
mv.addObject("depositories", depositoryService.findDepositoryAll());
/**
* 物料总数
*/
mv.addObject("materials", materialService.findMaterialAll());
// 转入物料数量
mv.addObject("InCount", depositoryRecordService.CalculateAllApplicationInCount());
@ -1411,7 +1403,7 @@ public class PageController {
@GetMapping("/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 javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
@RestController
@RequestMapping("/place")
@ -140,6 +137,21 @@ public class PlaceController {
else{
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)) {
return CrudUtil.postHandle(success, 1);
} 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);
/**
* 根据条件查询符合条件的库存总数
* @param map
* @return
*/
Integer findInventoryCount(Map<String,Object> map);
/**
* 根据条件查询符合条件的库存
* @param map
@ -136,4 +143,11 @@ public interface MaterialMapper {
*/
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 != '' ">
and code = #{code}
</if>
and depository_id is null
<if test="begin != null and size != null">
LIMIT #{begin},#{size}
</if>
@ -165,6 +166,38 @@
</if>
</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
@ -176,6 +209,13 @@
#{item}
</foreach>
</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" />
from materialandplace mp left join place p on p.id = mp.pid
where 1 = 1
<if test="did != null and did != ''">
and p.did = #{did}
</if>
<if test="mid != null and mid != ''">
and mp.mid = #{mid}
</if>
<if test="did != null and did != ''">
and ( p.did = #{did} or p.did = 0)
</if>
</select>
<!-- 根据条件参数查询列表 -->

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

@ -1,6 +1,7 @@
package com.dreamchaser.depository_manage.service;
import com.dreamchaser.depository_manage.entity.Depository;
import com.dreamchaser.depository_manage.entity.UserByPort;
import java.util.List;
import java.util.Map;
@ -109,11 +110,11 @@ public interface DepositoryService {
* 查询所有仓库名称即对应编号
* @return
*/
Map<String,Integer> findDepositoryAllNameAndId();
Map<String,Integer> findDepositoryAllNameAndId(UserByPort user);
/**
* 根据仓库名称获取当前仓库库存容量
* 根据名称或编码获取当前仓库库存容量
* @param dname
* @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);
/**
* 根据条件查询符合条件的库存总数
* @param map
* @return
*/
Integer findInventoryCount(Map<String,Object> map);
/**
* 根据编码获取对应物料
* @return
@ -149,4 +156,11 @@ public interface MaterialService {
* @return
*/
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);
/**
* 添加物料到库位
* @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<>();
param.put("depositoryId", depositoryId);
param.put("mname", material.getMname());
List<Material> materialByCondition = materialMapper.findMaterialByCondition(param);
param.put("code", material.getCode());
// 判断该仓库中有无该物体
List<Material> materialByCondition = materialMapper.findInventory(param);
// 获取当前入库金额
Double amounts = (quantity * price * 100);
// 获取平均价格
@ -364,7 +365,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
map.put("fromPlaceId",0);
}
map.put("toPlaceId",toPlaceId) ;
if("".equals(toPlaceId) || "0".equals(fromPlaceId)){
if("".equals(toPlaceId) || "0".equals(toPlaceId)){
map.put("toPlaceId",0);
}
//清除主键
@ -439,6 +440,16 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
// 如果当前库位数量不足
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) {
// 当前出库金额
@ -496,9 +507,9 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
TransferRecord transferRecor = transferRecordMapper.findTransferRecordById(transferId);
Integer mid = transferRecor.getMid();
Material material = materialMapper.findMaterialById(mid);
param.put("mname", material.getMname());
param.put("code", material.getCode());
param.put("depositoryId", transferRecor.getToId());
List<Material> materiallist = materialMapper.findMaterialByCondition(param);
List<Material> materiallist = materialMapper.findInventory(param);
if (materiallist.size() > 0) {
// 如果在该仓库
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();
}
/**
* 获取本部门以及个人管理仓库的名称和id
* @return
*/
@Override
public Map<String, Integer> findDepositoryAllNameAndId() {
List<Depository> depositoryAll = depositoryMapper.findDepositoryAll();
Map<String,Integer> map = new HashMap<>();
for (int i = 0; i < depositoryAll.size(); i++) {
if(depositoryAll.get(i).getParentId() != 0) {
map.put(depositoryAll.get(i).getDname() + "," + depositoryAll.get(i).getCode(), depositoryAll.get(i).getId());
public Map<String, Integer> findDepositoryAllNameAndId(UserByPort user) {
// 获取当前用户所在部门管理的仓库
List<Depository> depositoryByAdminorg = depositoryMapper.findDepositoryByAdminorg(user.getMaindeparmentname());
// 仓库id列表
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;
}

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

@ -36,14 +36,16 @@ public class ExcelServiceImpl implements ExcelService {
@Autowired
PlaceService placeService;
/**
* 用于导入物料名称
*
* @param file
* @param excelInfo
* @return
*/
@Override
public ResultVo importExcelMaterial(MultipartFile file,String excelInfo) {
public ResultVo importExcelMaterial(MultipartFile file, String excelInfo) {
// 1.入参校验
ResultVo<String> checkExcelParam = excelutil.checkExcelParam(file);
if (!checkExcelParam.checkSuccess()) {
@ -55,19 +57,19 @@ public class ExcelServiceImpl implements ExcelService {
if (!resultVo.checkSuccess()) {
return resultVo;
}
String filePath = (String)resultVo.getData();
String filePath = (String) resultVo.getData();
if (StringUtils.isBlank(filePath)) {
return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空");
}
// 3.读取excel文件
Map<String,Object> readResult = new HashMap<>();
if("material".equals(excelInfo)){
readResult = excelutil.simpleExcelRead(filePath, ExcelInfo.class);
Map<String, Object> readResult = new HashMap<>();
if ("material".equals(excelInfo)) {
readResult = excelutil.simpleExcelRead(filePath, ExcelInfo.class);
}
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);
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());
return ResultVoUtil.error("上传Excel文件为空");
}
@ -76,25 +78,25 @@ public class ExcelServiceImpl implements ExcelService {
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
taskCenterUtil.submitTask(() -> {
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++) {
Map<String,Object> param = new HashMap<>();
param.put("mname",excelVos.get(i).getMname());
param.put("code",excelVos.get(i).getCode());
param.put("unit",excelVos.get(i).getUnit());
param.put("version",excelVos.get(i).getVersion());
param.put("texture",excelVos.get(i).getTexture());
param.put("materialTypeId",excelVos.get(i).getTypeId());
param.put("id",excelVos.get(i).getId());
Map<String, Object> param = new HashMap<>();
param.put("mname", excelVos.get(i).getMname());
param.put("code", excelVos.get(i).getCode());
param.put("unit", excelVos.get(i).getUnit());
param.put("version", excelVos.get(i).getVersion());
param.put("texture", excelVos.get(i).getTexture());
param.put("materialTypeId", excelVos.get(i).getTypeId());
param.put("id", excelVos.get(i).getId());
materialService.insertMaterial(param);
success.add(excelVos.get(i));
}
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos));
returnResult.put("success",success);
returnResult.put("errMsg",errMsg);
return ResultVoUtil.returnResultVo(200,returnResult,"结果");
returnResult.put("success", success);
returnResult.put("errMsg", errMsg);
return ResultVoUtil.returnResultVo(200, returnResult, "结果");
});
// 4.2删除临时文件
boolean deleteFile = FileUtil.deleteFile(new File(filePath));
@ -103,12 +105,13 @@ public class ExcelServiceImpl implements ExcelService {
return ResultVoUtil.error("删除临时文件失败");
}
log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath);
return ResultVoUtil.returnResultVo(200,readResult,"结果");
return ResultVoUtil.returnResultVo(200, readResult, "结果");
// return ResultVoUtil.success(excelVos);
}
/**
* 用于导入物料分类
*
* @param file
* @return
*/
@ -125,20 +128,20 @@ public class ExcelServiceImpl implements ExcelService {
if (!resultVo.checkSuccess()) {
return resultVo;
}
String filePath = (String)resultVo.getData();
String filePath = (String) resultVo.getData();
if (StringUtils.isBlank(filePath)) {
return ResultVoUtil.error("【导入Excel文件】生成的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<String> errMsg =(List<String>) readResult.get("errMsg");
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) ) {
if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.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(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1)) {
log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename());
return ResultVoUtil.error("上传Excel文件为空");
}
@ -147,16 +150,16 @@ public class ExcelServiceImpl implements ExcelService {
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
taskCenterUtil.submitTask(() -> {
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++) {
Map<String,Object> insert = new HashMap<>();
insert.put("id",excelVos.get(i).getId());
insert.put("tname",excelVos.get(i).getTname());
insert.put("introduce",excelVos.get(i).getIntroduce());
if(excelVos.get(i).getParentId() == null){
insert.put("materialTypeId",0);
}else {
Map<String, Object> insert = new HashMap<>();
insert.put("id", excelVos.get(i).getId());
insert.put("tname", excelVos.get(i).getTname());
insert.put("introduce", excelVos.get(i).getIntroduce());
if (excelVos.get(i).getParentId() == null) {
insert.put("materialTypeId", 0);
} else {
insert.put("materialTypeId", excelVos.get(i).getParentId());
}
materialTypeService.insertMaterialType(insert);
@ -164,9 +167,9 @@ public class ExcelServiceImpl implements ExcelService {
}
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos));
returnResult.put("success",success);
returnResult.put("errMsg",errMsg);
return ResultVoUtil.returnResultVo(200,returnResult,"结果");
returnResult.put("success", success);
returnResult.put("errMsg", errMsg);
return ResultVoUtil.returnResultVo(200, returnResult, "结果");
});
// 4.2删除临时文件
boolean deleteFile = FileUtil.deleteFile(new File(filePath));
@ -175,7 +178,7 @@ public class ExcelServiceImpl implements ExcelService {
return ResultVoUtil.error("删除临时文件失败");
}
log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath);
return ResultVoUtil.returnResultVo(200,readResult,"结果");
return ResultVoUtil.returnResultVo(200, readResult, "结果");
// return ResultVoUtil.success(excelVos);
}
@ -183,6 +186,7 @@ public class ExcelServiceImpl implements ExcelService {
/**
* 用于导入库存信息
*
* @param file
* @return
*/
@ -199,21 +203,21 @@ public class ExcelServiceImpl implements ExcelService {
if (!resultVo.checkSuccess()) {
return resultVo;
}
String filePath = (String)resultVo.getData();
String filePath = (String) resultVo.getData();
if (StringUtils.isBlank(filePath)) {
return ResultVoUtil.error("【导入Excel文件】生成的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<String> errMsg =(List<String>) readResult.get("errMsg");
List<String> dataIndex =(List<String>) readResult.get("dataIndex");
List<String> errMsg = (List<String>) readResult.get("errMsg");
List<String> dataIndex = (List<String>) readResult.get("dataIndex");
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());
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());
return ResultVoUtil.error("上传Excel文件为空");
}
@ -225,92 +229,110 @@ public class ExcelServiceImpl implements ExcelService {
String placeCode = excelInfoByInventories.get(i).getDepositoryCode();
Integer depositoryId = excelInfoByInventories.get(i).getDepositoryId();
// 如果导入时输入库位信息
if(!placeCode.isEmpty()) {
Map<String,Object> placeMap = new HashMap<>();
placeMap.put("did",depositoryId);
placeMap.put("code",placeCode);
if (placeCode != null && !placeCode.isEmpty()) {
Map<String, Object> placeMap = new HashMap<>();
placeMap.put("did", depositoryId);
placeMap.put("code", placeCode);
// 根据仓库及库位码获取库位
List<Place> placeByCondition = placeService.findPlaceByCondition(placeMap);
if(placeByCondition.size()>0){
if (placeByCondition.size() > 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 msg = s + "出现异常:" + excelInfoByInventories.get(i).getDepositoryCode() + " 该库位已有物料";
String msg = s + "出现异常:" + excelInfoByInventories.get(i).getDepositoryCode() + " 该库位无法存放当前数目的物料";
errMsg.add(msg);
continue;
}else {
// 如果当前库位没有物料或该库位存放的物料为当前物料
Integer quantity = ObjectFormatUtil.toInteger(excelInfoByInventories.get(i).getQuantity());
if(quantity > place.getMax() - place.getQuantity()){
// 如果当前库位无法放下
String s = dataIndex.get(i);
String msg = s + "出现异常:" + excelInfoByInventories.get(i).getDepositoryCode() + " 该库位无法存放当前数目的物料";
errMsg.add(msg);
continue;
}else {
Map<String, Object> updatePlace = new HashMap<>();
updatePlace.put("mid", materialByCode.getId());
updatePlace.put("id", place.getId());
updatePlace.put("quantity",quantity + place.getQuantity());
excelVos.add(excelInfoByInventories.get(i));
placeService.UpdatePlace(updatePlace);
}
} else {
// 修改当前库位库存
Map<String, Object> updatePlace = new HashMap<>();
updatePlace.put("id", place.getId());
updatePlace.put("quantity", quantity + place.getQuantity());
placeService.UpdatePlace(updatePlace);
excelVos.add(excelInfoByInventories.get(i));
// 添加库位与物料记录
updatePlace.remove("id");
updatePlace.put("mid", materialByCode.getId());
updatePlace.put("pid", place.getId());
placeService.addMaterialOnPlace(updatePlace);
}
}else{
} else {
String s = dataIndex.get(i);
String msg = s + "出现异常:" + excelInfoByInventories.get(i).getDepositoryCode() + " 该仓库没有该库位";
errMsg.add(msg);
continue;
}
} else { // 否则直接加入
excelVos.add(excelInfoByInventories.get(i));
}
}
readResult.put("dataList",excelVos);
readResult.put("dataList", excelVos);
// 4.通过线程池开启一个线程去执行数据库操作,主线程继续往下执行
// 4.1开启一个线程
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
taskCenterUtil.submitTask(() -> {
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++) {
// 获取对应物料
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();
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());
update.put("amounts",String.valueOf(materialByCode.getAmounts()+amounts));
Double amounts = Double.parseDouble(excelVos.get(i).getPrice()) * 100 * Double.parseDouble(excelVos.get(i).getQuantity());
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);
avgPrice = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
update.put("price",String.valueOf(avgPrice));
}else {
avgPrice = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
insert.put("price", String.valueOf(avgPrice));
} else {
// 求均值
update.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() ));
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()));
// 保留两位
BigDecimal bg = new BigDecimal(avgPrice);
avgPrice = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
update.put("price",String.valueOf(avgPrice));
avgPrice = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
insert.put("price", String.valueOf(avgPrice));
}
update.put("depositoryId", depositoryId);
update.put("depositoryCode",excelVos.get(i).getDepositoryCode());
update.put("id",materialByCode.getId());
materialService.updateMaterial(update);
insert.put("depositoryId", depositoryId);
insert.put("depositoryCode", excelVos.get(i).getDepositoryCode());
materialService.insertMaterial(insert);
// 将该物料同时放入默认库位中
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));
}
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos));
returnResult.put("success",success);
returnResult.put("errMsg",errMsg);
return ResultVoUtil.returnResultVo(200,returnResult,"结果");
returnResult.put("success", success);
returnResult.put("errMsg", errMsg);
return ResultVoUtil.returnResultVo(200, returnResult, "结果");
});
// 4.2删除临时文件
boolean deleteFile = FileUtil.deleteFile(new File(filePath));
@ -319,6 +341,6 @@ public class ExcelServiceImpl implements ExcelService {
return ResultVoUtil.error("删除临时文件失败");
}
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 mid = list.get(i).getId();
List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(mid, depositoryId);
StringBuilder placeCode = new StringBuilder();
for (int j = 0; j < placeByMidAndDid.size(); j++) {
placeCode.append(placeByMidAndDid.get(j).getCode()).append(" ");
if(depositoryId != null) {
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){
Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId);
String code = depositoryRecordById.getCode();
@ -182,6 +186,16 @@ public class MaterialServiceImpl implements MaterialService {
return pack(list);
}
/**
* 根据条件查询符合条件的库存总数
* @param map
* @return
*/
@Override
public Integer findInventoryCount(Map<String, Object> map) {
return materialMapper.findInventoryCount(map);
}
/**
* 根据编码获取对应物料
* @return
@ -362,6 +376,12 @@ public class MaterialServiceImpl implements MaterialService {
return materialMapper.findMaterialByDepositorys(dids);
}
@Override
public List<MaterialP> findMaterialByDepository(Integer depositoryId) {
List<Material> materialByDepository = materialMapper.findMaterialByDepository(depositoryId);
return pack(materialByDepository);
}
/**
* 构造树形选择框
* @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++) {
Place place = placeByCondition.get(i);
PlaceP pp = new PlaceP(place);
Depository depositoryRecordById = depositoryService.findDepositoryRecordById(place.getDid());
pp.setDepositoryName(depositoryRecordById.getDname());
Integer did = place.getDid();
if(did != 0){
Depository depositoryRecordById = depositoryService.findDepositoryRecordById(did);
pp.setDepositoryName(depositoryRecordById.getDname());
}else{
pp.setDepositoryName("默认库位");
}
placePList.add(pp);
}
return placePList;
@ -205,4 +210,15 @@ public class PlaceServiceImpl implements PlaceService {
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: -50%;*/
/*margin-right: 50%;*/
padding-left: 26px;
/*padding-left: 26px;*/
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>
layui.use(['jquery', 'layer', 'miniAdmin','miniTongji'], function () {
var $ = layui.jquery,
layer = layui.layer,
@ -158,17 +159,7 @@
$("#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 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 === "部门负责人审核未通过") {
// , {title: "未入库"}
states = [ {title: state}];
number = 2;
} else {
// {title: "提交申请"},
states = [ {title: state}];
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;
text-align: center;
}
.top-panel > .layui-card-body{
.top-panel > .layui-card-body {
height: 60px;
}
.top-panel-number{
line-height:60px;
.top-panel-number {
line-height: 60px;
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
}
</style>
@ -114,7 +117,7 @@
<button class="layui-btn" lay-submit lay-filter="thisWeek">
&emsp;本周&emsp;
</button>
<button class="layui-btn" lay-submit lay-filter="lastWeek" >
<button class="layui-btn" lay-submit lay-filter="lastWeek">
&emsp;上周&emsp;
</button>
<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>
layui.use(['layer', 'echarts'], function () {
var $ = layui.jquery,
var $ = layui.jquery,
layer = layui.layer,
echarts = layui.echarts,
form = layui.form;
@ -260,8 +263,7 @@
tooltip: {},
dataset: {
dimensions: [],
source: [
]
source: []
},
xAxis: {type: 'category'},
yAxis: {},
@ -284,8 +286,7 @@
showContent: false
},
dataset: {
source: [
]
source: []
},
xAxis: {type: 'category'},
yAxis: {gridIndex: 0},
@ -312,17 +313,21 @@
//动态加载相关数据
$.ajax({
url:'/repository/layui/echart_back?type=2',
type:'get',
async:true,
url: '/repository/layui/echart_back?type=2',
type: 'get',
async: true,
dataType: "json",
complete:function (XHR,TS){
if(XHR.status != 200){
complete: function (XHR, TS) {
if (XHR.status !== 200) {
layer.alert("系统繁忙,稍后重试");
}
},
success:function (result){
if(result.code == 0){
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (result) {
layer.close(this.layerIndex);
if (result.code === 0) {
echartsRecords.setOption(optionRecords);
echartsPies.setOption(optionPies);
echartsDataset.setOption(optionDataset);
@ -330,7 +335,7 @@
console.log(result)
// 折线图
var optionRecordsSeries=[];
var optionRecordsSeries = [];
// 饼状图
var optionPiesSeries = {
name: '昨日占比',
@ -345,28 +350,29 @@
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
},
data:[]
data: []
}
// 柱状图
optionDataset = {
legend: {},
tooltip: {},
dataset: {
dimensions:[],
source:[]
dimensions: [],
source: []
},
series:[]
series: []
};
for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({
name: result.data.depository_name[i],
type: 'line',
stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]],
data: result.data.depository_data.data[result.data.depository_name[i]],
areaStyle: {}
});
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]
@ -375,10 +381,10 @@
optionDataset.dataset.source.push(result.data.depository_data.sourceList[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.series.push({type: 'line', smooth: true, seriesLayoutBy: 'row'})
@ -402,7 +408,6 @@
)
optionRecords = {
title: {
text: '出库仓库-报表图'
@ -475,28 +480,27 @@
}
form.on('submit(thisWeek)', function () {
$.ajax({
url:'/repository/layui/echart_back?type=2',
type:'get',
async:true,
url: '/repository/layui/echart_back?type=2',
type: 'get',
async: true,
dataType: "json",
complete:function (XHR,TS){
if(XHR.status != 200){
complete: function (XHR, TS) {
if (XHR.status != 200) {
layer.alert("系统繁忙,稍后重试");
}
},
success:function (result){
success: function (result) {
echartsRecords.setOption(optionRecords);
// 折线图
var optionRecordsSeries=[];
var optionRecordsSeries = [];
for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({
name: result.data.depository_name[i],
type: 'line',
stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]],
data: result.data.depository_data.data[result.data.depository_name[i]],
areaStyle: {}
});
}
@ -548,25 +552,25 @@
form.on('submit(lastWeek)', function () {
$.ajax({
url:'/repository/layui/echart_back?type=2&last=1',
type:'get',
async:true,
url: '/repository/layui/echart_back?type=2&last=1',
type: 'get',
async: true,
dataType: "json",
complete:function (XHR,TS){
if(XHR.status != 200){
complete: function (XHR, TS) {
if (XHR.status != 200) {
layer.alert("系统繁忙,稍后重试");
}
},
success:function (result){
success: function (result) {
echartsRecords.setOption(optionRecords);
// 折线图
var optionRecordsSeries=[];
var optionRecordsSeries = [];
for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({
name: result.data.depository_name[i],
type: 'line',
stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]],
data: result.data.depository_data.data[result.data.depository_name[i]],
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.utils.*;
import lombok.extern.log4j.Log4j2;
import org.joda.time.DateTimeUtils;
import org.junit.runner.RunWith;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
@ -30,8 +31,9 @@ import java.util.concurrent.TimeUnit;
public class Test {
@org.junit.Test
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 != '' ">
and code = #{code}
</if>
and depository_id is null
<if test="begin != null and size != null">
LIMIT #{begin},#{size}
</if>
@ -165,6 +166,38 @@
</if>
</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
@ -176,6 +209,13 @@
#{item}
</foreach>
</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" />
from materialandplace mp left join place p on p.id = mp.pid
where 1 = 1
<if test="did != null and did != ''">
and p.did = #{did}
</if>
<if test="mid != null and mid != ''">
and mp.mid = #{mid}
</if>
<if test="did != null and did != ''">
and ( p.did = #{did} or p.did = 0)
</if>
</select>
<!-- 根据条件参数查询列表 -->

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

@ -58,7 +58,7 @@
/*margin-left: -20px;*/
/*margin-left: -50%;*/
/*margin-right: 50%;*/
padding-left: 26px;
/*padding-left: 26px;*/
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>
layui.use(['jquery', 'layer', 'miniAdmin','miniTongji'], function () {
var $ = layui.jquery,
layer = layui.layer,
@ -158,17 +159,7 @@
$("#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 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 === "部门负责人审核未通过") {
// , {title: "未入库"}
states = [ {title: state}];
number = 2;
} else {
// {title: "提交申请"},
states = [ {title: state}];
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;
text-align: center;
}
.top-panel > .layui-card-body{
.top-panel > .layui-card-body {
height: 60px;
}
.top-panel-number{
line-height:60px;
.top-panel-number {
line-height: 60px;
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
}
</style>
@ -114,7 +117,7 @@
<button class="layui-btn" lay-submit lay-filter="thisWeek">
&emsp;本周&emsp;
</button>
<button class="layui-btn" lay-submit lay-filter="lastWeek" >
<button class="layui-btn" lay-submit lay-filter="lastWeek">
&emsp;上周&emsp;
</button>
<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>
layui.use(['layer', 'echarts'], function () {
var $ = layui.jquery,
var $ = layui.jquery,
layer = layui.layer,
echarts = layui.echarts,
form = layui.form;
@ -260,8 +263,7 @@
tooltip: {},
dataset: {
dimensions: [],
source: [
]
source: []
},
xAxis: {type: 'category'},
yAxis: {},
@ -284,8 +286,7 @@
showContent: false
},
dataset: {
source: [
]
source: []
},
xAxis: {type: 'category'},
yAxis: {gridIndex: 0},
@ -312,17 +313,21 @@
//动态加载相关数据
$.ajax({
url:'/repository/layui/echart_back?type=2',
type:'get',
async:true,
url: '/repository/layui/echart_back?type=2',
type: 'get',
async: true,
dataType: "json",
complete:function (XHR,TS){
if(XHR.status != 200){
complete: function (XHR, TS) {
if (XHR.status !== 200) {
layer.alert("系统繁忙,稍后重试");
}
},
success:function (result){
if(result.code == 0){
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (result) {
layer.close(this.layerIndex);
if (result.code === 0) {
echartsRecords.setOption(optionRecords);
echartsPies.setOption(optionPies);
echartsDataset.setOption(optionDataset);
@ -330,7 +335,7 @@
console.log(result)
// 折线图
var optionRecordsSeries=[];
var optionRecordsSeries = [];
// 饼状图
var optionPiesSeries = {
name: '昨日占比',
@ -345,28 +350,29 @@
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
},
data:[]
data: []
}
// 柱状图
optionDataset = {
legend: {},
tooltip: {},
dataset: {
dimensions:[],
source:[]
dimensions: [],
source: []
},
series:[]
series: []
};
for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({
name: result.data.depository_name[i],
type: 'line',
stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]],
data: result.data.depository_data.data[result.data.depository_name[i]],
areaStyle: {}
});
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]
@ -375,10 +381,10 @@
optionDataset.dataset.source.push(result.data.depository_data.sourceList[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.series.push({type: 'line', smooth: true, seriesLayoutBy: 'row'})
@ -402,7 +408,6 @@
)
optionRecords = {
title: {
text: '出库仓库-报表图'
@ -475,28 +480,27 @@
}
form.on('submit(thisWeek)', function () {
$.ajax({
url:'/repository/layui/echart_back?type=2',
type:'get',
async:true,
url: '/repository/layui/echart_back?type=2',
type: 'get',
async: true,
dataType: "json",
complete:function (XHR,TS){
if(XHR.status != 200){
complete: function (XHR, TS) {
if (XHR.status != 200) {
layer.alert("系统繁忙,稍后重试");
}
},
success:function (result){
success: function (result) {
echartsRecords.setOption(optionRecords);
// 折线图
var optionRecordsSeries=[];
var optionRecordsSeries = [];
for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({
name: result.data.depository_name[i],
type: 'line',
stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]],
data: result.data.depository_data.data[result.data.depository_name[i]],
areaStyle: {}
});
}
@ -548,25 +552,25 @@
form.on('submit(lastWeek)', function () {
$.ajax({
url:'/repository/layui/echart_back?type=2&last=1',
type:'get',
async:true,
url: '/repository/layui/echart_back?type=2&last=1',
type: 'get',
async: true,
dataType: "json",
complete:function (XHR,TS){
if(XHR.status != 200){
complete: function (XHR, TS) {
if (XHR.status != 200) {
layer.alert("系统繁忙,稍后重试");
}
},
success:function (result){
success: function (result) {
echartsRecords.setOption(optionRecords);
// 折线图
var optionRecordsSeries=[];
var optionRecordsSeries = [];
for (let i = 0; i < result.data.depository_name.length; i++) {
optionRecordsSeries.push({
name: result.data.depository_name[i],
type: 'line',
stack: '金额',
data:result.data.depository_data.data[result.data.depository_name[i]],
data: result.data.depository_data.data[result.data.depository_name[i]],
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