add:成品盘点

This commit is contained in:
2023-05-31 17:22:12 +08:00
parent 432e5e020d
commit f862349a78
24 changed files with 1113 additions and 253 deletions

View File

@@ -21,6 +21,9 @@
<if test="status != null and status != ''">
and re.status = #{status}
</if>
<if test="storagevehicle_code != null and storagevehicle_code != ''">
and re.storagevehicle_code = #{storagevehicle_code}
</if>
<if test="bucketunique != null and bucketunique != ''">
and ( re.bucketunique like '{bucketunique}%$' )
</if>

View File

@@ -1,8 +1,18 @@
package org.nl.wms.storage_manage.productmanage.controller.check;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiOperation;
import org.nl.common.anno.Log;
import org.nl.common.domain.query.PageQuery;
import org.nl.wms.storage_manage.productmanage.service.check.IStIvtCheckmstCpService;
import org.nl.wms.storage_manage.productmanage.service.check.dto.CheckQueryMst;
import org.nl.wms.storage_manage.rawmanage.service.check.IStIvtCheckmstYlService;
import org.nl.wms.storage_manage.rawmanage.service.check.dto.CheckQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
/**
* <p>
@@ -13,8 +23,95 @@ import org.springframework.web.bind.annotation.RestController;
* @since 2023-05-04
*/
@RestController
@RequestMapping("/stIvtCheckmstCp")
@RequestMapping("/api/stIvtCheckmstCp")
public class StIvtCheckmstCpController {
@Autowired
private IStIvtCheckmstCpService iStIvtCheckmstCpService;
@GetMapping
@Log("查询盘点单主表")
@ApiOperation("查询盘点单主表")
public ResponseEntity<Object> query(CheckQueryMst query, PageQuery page) {
return new ResponseEntity<>(iStIvtCheckmstCpService.pageQuery(query, page), HttpStatus.OK);
}
@PostMapping
@Log("创建盘点单")
@ApiOperation("创建盘点单")
public ResponseEntity<Object> create(@RequestBody JSONObject whereJson) {
iStIvtCheckmstCpService.create(whereJson);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/getCheckDtl")
@Log("查询盘点明细")
@ApiOperation("查询盘点明细")
public ResponseEntity<Object> getCheckDtl(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(iStIvtCheckmstCpService.getCheckDtl(whereJson), HttpStatus.OK);
}
@PostMapping("/update")
@Log("修改盘点单")
@ApiOperation("修改盘点单")
public ResponseEntity<Object> update(@RequestBody JSONObject whereJson) {
iStIvtCheckmstCpService.update(whereJson);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/delete")
@Log("删除盘点单")
@ApiOperation("删除盘点单")
public ResponseEntity<Object> delete(@RequestBody Long[] ids){
iStIvtCheckmstCpService.delete(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/saveCheck")
@Log("盘点保存")
@ApiOperation("盘点保存")
public ResponseEntity<Object> saveCheck(@RequestBody JSONObject whereJson) {
iStIvtCheckmstCpService.saveCheck(whereJson);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/confirm")
@Log("盘点强制确认")
@ApiOperation("盘点强制确认")
public ResponseEntity<Object> confirm(@RequestBody JSONObject whereJson) {
iStIvtCheckmstCpService.confirm(whereJson);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/process1")
@Log("实盘为准,生成损溢单修改库存")
@ApiOperation("实盘为准,生成损溢单修改库存")
public ResponseEntity<Object> process1(@RequestBody JSONObject whereJson) {
iStIvtCheckmstCpService.process1(whereJson);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/process0")
@Log("账务为准")
@ApiOperation("账务为准")
public ResponseEntity<Object> process0(@RequestBody JSONObject whereJson) {
iStIvtCheckmstCpService.process0(whereJson);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/getBucketrecord")
@Log("获取箱")
@ApiOperation("获取箱")
public ResponseEntity<Object> getBucketrecord(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(iStIvtCheckmstCpService.getBucketrecord(whereJson),HttpStatus.OK);
}
@PostMapping("/processBox")
@Log("拆箱盘点保存")
@ApiOperation("拆箱盘点保存")
public ResponseEntity<Object> processBox(@RequestBody JSONObject whereJson) {
iStIvtCheckmstCpService.processBox(whereJson);
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@@ -1,7 +1,14 @@
package org.nl.wms.storage_manage.productmanage.service.check;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckdtlCp;
import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckmstCp;
import org.nl.wms.storage_manage.rawmanage.service.check.dao.StIvtCheckmstYl;
import java.util.List;
import java.util.Map;
/**
* <p>
@@ -13,4 +20,7 @@ import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckdtlCp
*/
public interface IStIvtCheckdtlCpService extends IService<StIvtCheckdtlCp> {
double create(JSONArray row, StIvtCheckmstCp mst);
List<Map> getCheckDtl(JSONObject map);
}

View File

@@ -1,7 +1,14 @@
package org.nl.wms.storage_manage.productmanage.service.check;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.common.domain.query.PageQuery;
import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckmstCp;
import org.nl.wms.storage_manage.productmanage.service.check.dto.CheckQueryMst;
import org.nl.wms.storage_manage.rawmanage.service.check.dto.CheckQuery;
import java.util.List;
import java.util.Map;
/**
* <p>
@@ -12,5 +19,37 @@ import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckmstCp
* @since 2023-05-04
*/
public interface IStIvtCheckmstCpService extends IService<StIvtCheckmstCp> {
/**
* 分页查询
* @param query,page /
* @return JSONObject
*/
Object pageQuery(CheckQueryMst query, PageQuery page);
void create(JSONObject jo);
List<Map> getCheckDtl(JSONObject map);
void update(JSONObject map);
/**
* 删除
* @param ids
* {
* 主表id..
* }
*/
void delete(Long[] ids);
void saveCheck(JSONObject jo);
void confirm(JSONObject jo);
void process0(JSONObject jo);
void process1(JSONObject jo);
Object getBucketrecord(JSONObject whereJson);
void processBox(JSONObject whereJson);
}

View File

@@ -1,5 +1,6 @@
package org.nl.wms.storage_manage.productmanage.service.check.dao;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -25,6 +26,7 @@ public class StIvtCheckdtlCp implements Serializable {
/**
* 盘点单明细id
*/
@TableId
private String checkdtl_id;
/**
@@ -115,7 +117,7 @@ public class StIvtCheckdtlCp implements Serializable {
/**
* 盘点结果
*/
private Boolean check_result;
private String check_result;
/**
* 盘点人

View File

@@ -1,5 +1,6 @@
package org.nl.wms.storage_manage.productmanage.service.check.dao;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -26,6 +27,7 @@ public class StIvtCheckmstCp implements Serializable {
/**
* 盘点单标识
*/
@TableId
private String check_id;
/**
@@ -76,7 +78,7 @@ public class StIvtCheckmstCp implements Serializable {
/**
* 创建时间
*/
private LocalDateTime create_time;
private String create_time;
/**
* 审核人

View File

@@ -1,8 +1,13 @@
package org.nl.wms.storage_manage.productmanage.service.check.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckdtlCp;
import java.util.List;
import java.util.Map;
/**
* <p>
* 盘点单明细表 Mapper 接口
@@ -13,4 +18,5 @@ import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckdtlCp
*/
public interface StIvtCheckdtlCpMapper extends BaseMapper<StIvtCheckdtlCp> {
List<Map> getCheckDtl(@Param("map") Map map);
}

View File

@@ -1,5 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.storage_manage.productmanage.service.check.dao.mapper.StIvtCheckdtlCpMapper">
<select id="getCheckDtl" resultType="java.util.Map">
SELECT
CheckDtl.*,
struct.struct_code,
struct.sect_code,
mb.material_code,
mb.material_name,
user1.person_name AS process_optname
FROM
st_ivt_checkdtl_cp CheckDtl
LEFT JOIN md_me_materialbase mb ON mb.material_id = CheckDtl.material_id
LEFT JOIN st_ivt_structattr struct ON struct.struct_id = CheckDtl.struct_id
LEFT JOIN sys_user user1 ON user1.user_id = CheckDtl.process_optid
<where>
1=1
<if test="map.check_id != '' and map.check_id != null">
and CheckDtl.check_id = #{map.check_id}
</if>
<if test="map.checkdtl_id != '' and map.checkdtl_id != null">
and CheckDtl.checkdtl_id = #{map.checkdtl_id}
</if>
<if test="map.status != '' and map.status != null">
and #{map.status} >= CheckDtl.status
</if>
<if test="map.check_result != '' and map.check_result != null and map.check_result != '-1'">
and #{map.check_result} = CheckDtl.check_result
</if>
<if test="map.check_result == '-1'">
and CheckDtl.check_result IN ('1','2')
</if>
</where>
order by CheckDtl.seq_no
</select>
</mapper>

View File

@@ -0,0 +1,35 @@
package org.nl.wms.storage_manage.productmanage.service.check.dto;
import lombok.Data;
import org.nl.common.domain.query.BaseQuery;
import org.nl.common.domain.query.QParam;
import org.nl.common.enums.QueryTEnum;
import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckmstCp;
import org.nl.wms.storage_manage.rawmanage.service.check.dao.StIvtCheckmstYl;
/*
* @author ZZQ
* @Date 2023/5/4 19:49
*/
@Data
public class CheckQueryMst extends BaseQuery<StIvtCheckmstCp> {
private String stor_id;
private String status;
private String check_type;
private String check_code;
private Boolean is_delete = false;
@Override
public void paramMapping() {
super.doP.put("check_code", QParam.builder().k(new String[]{"check_code"}).type(QueryTEnum.LK).build());
}
}

View File

@@ -1,11 +1,35 @@
package org.nl.wms.storage_manage.productmanage.service.check.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.common.utils.IdUtil;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.wms.masterdata_manage.service.vehicle.IMdPbStoragevehicleextService;
import org.nl.wms.masterdata_manage.service.vehicle.IMdPbStoragevehicleinfoService;
import org.nl.wms.masterdata_manage.service.vehicle.dao.MdPbStoragevehicleinfo;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtSectattrService;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtStructattrService;
import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtSectattr;
import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtStructattr;
import org.nl.wms.storage_manage.CHECKEnum;
import org.nl.wms.storage_manage.IOSEnum;
import org.nl.wms.storage_manage.productmanage.service.check.IStIvtCheckdtlCpService;
import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckdtlCp;
import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckmstCp;
import org.nl.wms.storage_manage.productmanage.service.check.dao.mapper.StIvtCheckdtlCpMapper;
import org.nl.wms.storage_manage.rawmanage.service.check.dao.StIvtCheckdtlYl;
import org.nl.wms.storage_manage.rawmanage.service.check.dao.StIvtCheckmstYl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* <p>
* 盘点单明细表 服务实现类
@@ -17,4 +41,72 @@ import org.springframework.stereotype.Service;
@Service
public class StIvtCheckdtlCpServiceImpl extends ServiceImpl<StIvtCheckdtlCpMapper, StIvtCheckdtlCp> implements IStIvtCheckdtlCpService {
@Autowired
private IStIvtSectattrService sectattrService; // 库区服务
@Autowired
private IStIvtStructattrService structattrService; // 仓位服务
@Autowired
private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; // 载具信息服务
@Override
public double create(JSONArray rows, StIvtCheckmstCp mst) {
double total_qty = 0;
if (rows.size() > 0 && ObjectUtil.isNotEmpty(mst)) {
// 先删除在插入
this.remove(new QueryWrapper<StIvtCheckdtlCp>().eq("check_id", mst.getCheck_id()));
for (int i = 0; i < rows.size(); i++) {
String checkdtl_id = IdUtil.getStringId();
StIvtCheckdtlCp row = rows.getJSONObject(i).toJavaObject(StIvtCheckdtlCp.class);
row.setCheckdtl_id(checkdtl_id);
row.setCheck_id(mst.getCheck_id());
row.setCheck_code(mst.getCheck_code());
row.setSeq_no(BigDecimal.valueOf(i + 1));
// 获取库区信息
QueryWrapper<StIvtSectattr> sect_wrapper = new QueryWrapper<>();
sect_wrapper.eq("sect_id", row.getSect_id());
sect_wrapper.eq("is_used", true);
StIvtSectattr sectDao = sectattrService.getOne(sect_wrapper);
if (ObjectUtil.isEmpty(sectDao)) throw new BadRequestException("库区不存在或未启用!");
row.setSect_name(sectDao.getSect_name());
// 获取仓位信息
QueryWrapper<StIvtStructattr> struct_wrapper = new QueryWrapper<>();
struct_wrapper.eq("struct_id", row.getStruct_id());
struct_wrapper.eq("is_used", true);
StIvtStructattr structDao = structattrService.getOne(struct_wrapper);
if (ObjectUtil.isEmpty(structDao)) throw new BadRequestException("仓位不存在或未启用!");
row.setStruct_name(structDao.getStruct_name());
// 获取载具信息
MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getOne(
new QueryWrapper<MdPbStoragevehicleinfo>().lambda()
.eq(MdPbStoragevehicleinfo::getStoragevehicle_code, row.getStoragevehicle_code())
);
row.setStoragevehicle_id(vehicleDao.getStoragevehicle_id());
row.setStoragevehicle_code(vehicleDao.getStoragevehicle_code());
row.setStatus(CHECKEnum.DTL_STATUS.code("生成"));
this.save(row);
//锁定货位
structattrService.update(
new UpdateWrapper<StIvtStructattr>().lambda()
.set(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("盘点锁"))
.set(StIvtStructattr::getInv_code,mst.getCheck_code())
.eq(StIvtStructattr::getStruct_id, row.getStruct_id())
);
}
}
return total_qty;
}
@Override
public List<Map> getCheckDtl(JSONObject map) {
return this.baseMapper.getCheckDtl(map);
}
}

View File

@@ -1,10 +1,51 @@
package org.nl.wms.storage_manage.productmanage.service.check.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.jsonwebtoken.lang.Assert;
import org.jetbrains.annotations.NotNull;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.wms.masterdata_manage.service.vehicle.IMdPbBucketrecordService;
import org.nl.wms.masterdata_manage.service.vehicle.dao.mapper.MdPbBucketrecordMapper;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtBsrealstorattrService;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtStructattrService;
import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtBsrealstorattr;
import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtStructattr;
import org.nl.wms.storage_manage.CHECKEnum;
import org.nl.wms.storage_manage.productmanage.service.check.IStIvtCheckdtlCpService;
import org.nl.wms.storage_manage.productmanage.service.check.IStIvtCheckmstCpService;
import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckdtlCp;
import org.nl.wms.storage_manage.productmanage.service.check.dao.StIvtCheckmstCp;
import org.nl.wms.storage_manage.productmanage.service.check.dao.mapper.StIvtCheckmstCpMapper;
import org.nl.wms.storage_manage.productmanage.service.check.dto.CheckQueryMst;
import org.nl.wms.storage_manage.productmanage.service.moreOrLess.IStIvtMoreorlessmstCpService;
import org.nl.wms.storage_manage.rawmanage.service.check.IStIvtCheckdtlYlService;
import org.nl.wms.storage_manage.rawmanage.service.check.dao.StIvtCheckdtlYl;
import org.nl.wms.storage_manage.rawmanage.service.check.dao.StIvtCheckmstYl;
import org.nl.wms.storage_manage.rawmanage.service.check.dto.CheckQuery;
import org.nl.wms.storage_manage.rawmanage.service.moveOrLess.IStIvtMoreorlessmstYlService;
import org.nl.wms.storage_manage.semimanage.MLEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
/**
* <p>
@@ -17,4 +58,417 @@ import org.springframework.stereotype.Service;
@Service
public class StIvtCheckmstCpServiceImpl extends ServiceImpl<StIvtCheckmstCpMapper, StIvtCheckmstCp> implements IStIvtCheckmstCpService {
@Autowired
private IStIvtBsrealstorattrService stIvtBsrealstorattrService; // 实物属性服务
@Autowired
private IStIvtCheckdtlCpService iStIvtCheckdtlCpService; // 盘点明细服务
@Autowired
private IStIvtStructattrService structattrService; // 仓位服务
@Autowired
private IStIvtMoreorlessmstCpService iStIvtMoreorlessmstCpService; // 损益主表服务
@Autowired
private IMdPbBucketrecordService iMdPbBucketrecordService; // 箱服务
@Autowired(required = false)
private MdPbBucketrecordMapper mdPbBucketrecordMapper; // 箱mapper服务
@Override
public Object pageQuery(CheckQueryMst query, PageQuery page) {
// 查询条件
page.setSort("check_code,DESC");
// 分页查询
Page<StIvtCheckmstCp> pageQuery = this.page(page.build(), query.build());
TableDataInfo<StIvtCheckmstCp> build = TableDataInfo.build(pageQuery);
return build;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(JSONObject form) {
JSONArray rows = form.getJSONArray("tableData");
if (ObjectUtil.isEmpty(rows)) throw new BadRequestException("请求参数不能为空");
// 调用主表 插入/更新方法
StIvtCheckmstCp checkmstCp = packageMstForm(new StIvtCheckmstCp(), form);
this.save(checkmstCp);
//调用明细表 插入方法
iStIvtCheckdtlCpService.create(rows, checkmstCp);
}
@Override
public List<Map> getCheckDtl(JSONObject map) {
return iStIvtCheckdtlCpService.getCheckDtl(map);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(JSONObject form) {
Assert.notNull(new Object[]{form, form.get("check_id")}, "请求参数不能为空");
StIvtCheckmstCp mst = form.toJavaObject(StIvtCheckmstCp.class);
this.updateById(mst);
JSONArray rows = form.getJSONArray("tableData");
if (ObjectUtil.isEmpty(rows)) throw new BadRequestException("请求参数不能为空");
// 调用明细表 插入/更新方法
iStIvtCheckdtlCpService.create(rows, mst);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void saveCheck(JSONObject whereJson) {
JSONObject form = whereJson.getJSONObject("row");
JSONArray rows = whereJson.getJSONArray("rows");
StIvtCheckmstCp jo_mst = this.getOne(new QueryWrapper<StIvtCheckmstCp>().eq("check_id", form.getString("check_id")).in("status", new String[]{"10", "30"}));
if (jo_mst == null) {
throw new BadRequestException("盘点单状态异常!");
}
iStIvtCheckdtlCpService.remove(new QueryWrapper<StIvtCheckdtlCp>().eq("check_id", form.getString("check_id")).in("status", new String[]{"01", "04"}));
for (int i = 0; i < rows.size(); i++) {
JSONObject jo = rows.getJSONObject(i);
String status = jo.getString("status");
StIvtCheckdtlCp dtl = jo.toJavaObject(StIvtCheckdtlCp.class);
double base_qty = jo.getDoubleValue("base_qty");
dtl.setSeq_no(BigDecimal.valueOf(i + 1));
//已盘点过的明细不再处理
if ("05,06,07,99".contains(status)) {
iStIvtCheckdtlCpService.updateById(dtl);
continue;
}
dtl.setStatus(CHECKEnum.DTL_STATUS.code("盘点中"));
dtl.setCheck_optid(SecurityUtils.getCurrentUserId());
dtl.setCheck_optname(SecurityUtils.getCurrentNickName());
dtl.setCheck_time(DateUtil.now());
double fac_qty = jo.getDoubleValue("fac_qty");
//判断盈亏
if (fac_qty > base_qty) {
dtl.setCheck_result("2");
} else if (fac_qty < base_qty) {
dtl.setCheck_result("1");
} else {
dtl.setCheck_result("0");
}
if (StrUtil.isEmpty(jo.getString("checkdtl_id"))) {
jo.put("checkdtl_id", IdUtil.getStringId());
}
iStIvtCheckdtlCpService.save(dtl);
}
jo_mst.setDtl_num(BigDecimal.valueOf(rows.size()));
jo_mst.setStatus(CHECKEnum.BILL_STATUS.code("盘点中"));
jo_mst.setIs_nok(false);
List<StIvtCheckdtlCp> dtl_list = iStIvtCheckdtlCpService.list(new QueryWrapper<StIvtCheckdtlCp>().eq("check_id", form.getString("check_id")).ne("check_result", "0"));
if (dtl_list.size() != 0) {
jo_mst.setIs_nok(true);
}
this.updateById(jo_mst);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void confirm(JSONObject whereJson) {
JSONObject form = whereJson.getJSONObject("row");
JSONArray rows = whereJson.getJSONArray("rows");
StIvtCheckmstCp jo_mst = this.getOne(new QueryWrapper<StIvtCheckmstCp>().eq("check_id", form.getString("check_id")).in("status", new String[]{"10", "30"}));
if (jo_mst == null) {
throw new BadRequestException("盘点单状态异常!");
}
iStIvtCheckdtlCpService.remove(new QueryWrapper<StIvtCheckdtlCp>().eq("check_id", form.getString("check_id")).in("status", new String[]{"01", "04"}));
//定义需要需要更新的的点位集合
HashSet<String> set = new HashSet<>();
for (int i = 0; i < rows.size(); i++) {
JSONObject jo = rows.getJSONObject(i);
String status = jo.getString("status");
StIvtCheckdtlCp dtl = jo.toJavaObject(StIvtCheckdtlCp.class);
double base_qty = jo.getDoubleValue("base_qty");
dtl.setSeq_no(BigDecimal.valueOf(i + 1));
//已盘点过的明细不再处理
if ("05,06,07,99".contains(status)) {
iStIvtCheckdtlCpService.updateById(dtl);
continue;
}
dtl.setStatus(CHECKEnum.DTL_STATUS.code("已盘点"));
dtl.setCheck_optid(SecurityUtils.getCurrentUserId());
dtl.setCheck_optname(SecurityUtils.getCurrentNickName());
dtl.setCheck_time(DateUtil.now());
double fac_qty = jo.getDoubleValue("fac_qty");
//判断盈亏
if (fac_qty > base_qty) {
dtl.setCheck_result("2");
} else if (fac_qty < base_qty) {
dtl.setCheck_result("1");
} else {
dtl.setCheck_result("0");
dtl.setStatus(CHECKEnum.DTL_STATUS.code("确认完成"));
}
if (StrUtil.isEmpty(jo.getString("checkdtl_id"))) {
jo.put("checkdtl_id", IdUtil.getStringId());
}
iStIvtCheckdtlCpService.save(dtl);
set.add(dtl.getStruct_id());
}
jo_mst.setDtl_num(BigDecimal.valueOf(rows.size()));
jo_mst.setIs_nok(false);
List<StIvtCheckdtlCp> dtl_list = iStIvtCheckdtlCpService.list(new QueryWrapper<StIvtCheckdtlCp>().eq("check_id", form.getString("check_id")).ne("check_result", "0"));
if (dtl_list.size() != 0) {
jo_mst.setIs_nok(true);
}
jo_mst.setStatus(CHECKEnum.BILL_STATUS.code("盘点中"));
List<StIvtCheckdtlCp> finish_list = iStIvtCheckdtlCpService.list(new QueryWrapper<StIvtCheckdtlCp>().eq("check_id", form.getString("check_id")).in("status", new String[]{"99", "07"}));
//说明全部确认
if (finish_list.size() == jo_mst.getDtl_num().intValue()) {
iStIvtCheckdtlCpService.update(new UpdateWrapper<StIvtCheckdtlCp>().set("status", "99").eq("check_id", form.getString("check_id")));
jo_mst.setStatus(CHECKEnum.BILL_STATUS.code("完成"));
jo_mst.setConfirm_optid(SecurityUtils.getCurrentUserId());
jo_mst.setConfirm_optname(SecurityUtils.getCurrentNickName());
jo_mst.setConfirm_time(DateUtil.now());
//锁定起点点位、仓位
set.forEach(struct_id -> structattrService.update(new UpdateWrapper<StIvtStructattr>().set("lock_type", "0").set("inv_code", "").eq("struct_id", struct_id)));
}
this.updateById(jo_mst);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void process0(JSONObject whereJson) {
JSONObject form = whereJson.getJSONObject("form");
JSONObject row = whereJson.getJSONObject("row");
StIvtCheckmstCp jo_mst = this.getOne(new QueryWrapper<StIvtCheckmstCp>().eq("check_id", form.getString("check_id")).ne("status", "99"));
if (jo_mst == null) {
throw new BadRequestException("盘点单状态异常!");
}
StIvtCheckdtlCp dtl = row.toJavaObject(StIvtCheckdtlCp.class);
dtl.setStatus(CHECKEnum.DTL_STATUS.code("确认完成"));
dtl.setProcess_optid(SecurityUtils.getCurrentUserId());
dtl.setProcess_time(DateUtil.now());
dtl.setProcess_type(CHECKEnum.PROCESS_TYPE.code("账务为准"));
dtl.setIs_process(true);
iStIvtCheckdtlCpService.updateById(dtl);
List<StIvtCheckdtlCp> finish_list = iStIvtCheckdtlCpService.list(new QueryWrapper<StIvtCheckdtlCp>().eq("check_id", form.getString("check_id")).in("status", new String[]{"99", "07"}));
//说明全部确认
if (finish_list.size() == jo_mst.getDtl_num().intValue()) {
iStIvtCheckdtlCpService.update(new UpdateWrapper<StIvtCheckdtlCp>().set("status", "99").eq("check_id", form.getString("check_id")));
jo_mst.setStatus(CHECKEnum.BILL_STATUS.code("完成"));
jo_mst.setConfirm_optid(SecurityUtils.getCurrentUserId());
jo_mst.setConfirm_optname(SecurityUtils.getCurrentNickName());
jo_mst.setConfirm_time(DateUtil.now());
//解锁起点点位、仓位
finish_list.stream()
.map(finish -> finish.getStruct_id())
.distinct()
.forEach(struct_id -> structattrService.update(new UpdateWrapper<StIvtStructattr>().set("inv_code", "").set("lock_type", "0").eq("struct_id", struct_id)));
}
this.updateById(jo_mst);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void process1(JSONObject whereJson) {
JSONObject form = whereJson.getJSONObject("form");
JSONObject row = whereJson.getJSONObject("row");
StIvtCheckmstCp jo_mst = this.getOne(new QueryWrapper<StIvtCheckmstCp>().eq("check_id", form.getString("check_id")).ne("status", "99"));
StIvtCheckdtlCp dtl = row.toJavaObject(StIvtCheckdtlCp.class);
if (jo_mst == null) {
throw new BadRequestException("盘点单状态异常!");
}
//创建损溢单
JSONObject mol_jo = new JSONObject();
mol_jo.put("buss_type", MLEnum.BILL_TYPE.code("盘点损溢"));
if (row.getString("check_result").equals("1")) {
mol_jo.put("mol_type", MLEnum.MOL_TYPE.code(""));
} else {
mol_jo.put("mol_type", MLEnum.MOL_TYPE.code(""));
}
mol_jo.put("stor_id", jo_mst.getStor_id());
mol_jo.put("remark", "盘点单:" + jo_mst.getCheck_code() + "生成的损溢单");
//创建明细
JSONObject dtl_jo = new JSONObject();
dtl_jo.put("sect_id", dtl.getSect_id());
dtl_jo.put("material_id", dtl.getMaterial_id());
dtl_jo.put("struct_id", dtl.getStruct_id());
dtl_jo.put("qty_unit_id", dtl.getQty_unit_id());
dtl_jo.put("qty_unit_name", dtl.getQty_unit_name());
dtl_jo.put("mol_qty", row.getString("check_result").equals("1") ? NumberUtil.sub(dtl.getBase_qty(), dtl.getFac_qty()) : NumberUtil.sub(dtl.getFac_qty(), dtl.getBase_qty()));
dtl_jo.put("source_billdtl_id", dtl.getCheckdtl_id());
dtl_jo.put("source_bill_type", jo_mst.getCheck_type());
dtl_jo.put("source_bill_code", jo_mst.getCheck_code());
dtl_jo.put("source_bill_table", "ST_IVT_CheckMst_CP");
dtl_jo.put("storagevehicle_id", dtl.getStoragevehicle_id());
dtl_jo.put("storagevehicle_code", dtl.getStoragevehicle_code());
JSONArray mol_rows = new JSONArray();
mol_rows.add(dtl_jo);
mol_jo.put("tableData", mol_rows);
mol_jo.put("auto_confirm", "1");
//创建损溢单
iStIvtMoreorlessmstCpService.create(mol_jo);
dtl.setStatus(CHECKEnum.DTL_STATUS.code("确认完成"));
dtl.setProcess_optid(SecurityUtils.getCurrentUserId());
dtl.setProcess_time(DateUtil.now());
dtl.setProcess_type(CHECKEnum.PROCESS_TYPE.code("实盘为准"));
dtl.setIs_process(true);
iStIvtCheckdtlCpService.updateById(dtl);
List<StIvtCheckdtlCp> finish_list = iStIvtCheckdtlCpService.list(new QueryWrapper<StIvtCheckdtlCp>().eq("check_id", form.getString("check_id")).in("status", new String[]{"99", "07"}));
//说明全部确认
if (finish_list.size() == jo_mst.getDtl_num().intValue()) {
iStIvtCheckdtlCpService.update(new UpdateWrapper<StIvtCheckdtlCp>().set("status", "99").eq("check_id", form.getString("check_id")));
jo_mst.setStatus(CHECKEnum.BILL_STATUS.code("完成"));
jo_mst.setConfirm_optid(SecurityUtils.getCurrentUserId());
jo_mst.setConfirm_optname(SecurityUtils.getCurrentNickName());
jo_mst.setConfirm_time(DateUtil.now());
//解锁起点点位、仓位
finish_list.stream()
.map(finish -> finish.getStruct_id())
.distinct()
.forEach(struct_id -> structattrService.update(new UpdateWrapper<StIvtStructattr>().set("inv_code", "").set("lock_type", "0").eq("struct_id", struct_id)));
}
this.updateById(jo_mst);
}
@Override
public Object getBucketrecord(JSONObject whereJson) {
return mdPbBucketrecordMapper.queryAll(whereJson);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void processBox(JSONObject whereJson) {
JSONObject form = whereJson.getJSONObject("form");
JSONArray row = whereJson.getJSONArray("row");
StIvtCheckmstCp jo_mst = this.getOne(new QueryWrapper<StIvtCheckmstCp>().eq("check_id", form.getString("check_id")).ne("status", "99"));
StIvtCheckdtlCp dtl = iStIvtCheckdtlCpService.getById(form.getString("checkdtl_id"));
if (jo_mst == null) {
throw new BadRequestException("盘点单状态异常!");
}
//创建损溢单
JSONObject mol_jo = new JSONObject();
mol_jo.put("buss_type", MLEnum.BILL_TYPE.code("盘点损溢"));
if (dtl.getCheck_result().equals("1")) {
mol_jo.put("mol_type", MLEnum.MOL_TYPE.code(""));
} else {
mol_jo.put("mol_type", MLEnum.MOL_TYPE.code(""));
}
mol_jo.put("stor_id", jo_mst.getStor_id());
mol_jo.put("remark", "盘点单:" + jo_mst.getCheck_code() + "生成的损溢单");
//创建明细
JSONArray mol_rows = new JSONArray();
for (int i = 0; i < row.size(); i++) {
JSONObject json = row.getJSONObject(i);
JSONObject dtl_jo = new JSONObject();
dtl_jo.put("sect_id", dtl.getSect_id());
dtl_jo.put("material_id", dtl.getMaterial_id());
dtl_jo.put("struct_id", dtl.getStruct_id());
dtl_jo.put("qty_unit_id", dtl.getQty_unit_id());
dtl_jo.put("qty_unit_name", dtl.getQty_unit_name());
dtl_jo.put("bucketunique", json.getString("bucketunique"));
dtl_jo.put("mol_qty", dtl.getCheck_result().equals("1") ? NumberUtil.sub(json.getBigDecimal("storage_qty"), json.getBigDecimal("ivt_qty_ck")) : NumberUtil.sub(json.getBigDecimal("ivt_qty_ck"), json.getBigDecimal("storage_qty")));
dtl_jo.put("source_billdtl_id", dtl.getCheckdtl_id());
dtl_jo.put("source_bill_type", jo_mst.getCheck_type());
dtl_jo.put("source_bill_code", jo_mst.getCheck_code());
dtl_jo.put("source_bill_table", "ST_IVT_CheckMst_CP");
dtl_jo.put("storagevehicle_id", dtl.getStoragevehicle_id());
dtl_jo.put("storagevehicle_code", dtl.getStoragevehicle_code());
mol_rows.add(dtl_jo);
}
mol_jo.put("tableData", mol_rows);
mol_jo.put("auto_confirm", "1");
//创建损溢单
iStIvtMoreorlessmstCpService.create(mol_jo);
dtl.setStatus(CHECKEnum.DTL_STATUS.code("确认完成"));
dtl.setProcess_optid(SecurityUtils.getCurrentUserId());
dtl.setProcess_time(DateUtil.now());
dtl.setProcess_type(CHECKEnum.PROCESS_TYPE.code("实盘为准"));
dtl.setIs_process(true);
iStIvtCheckdtlCpService.updateById(dtl);
List<StIvtCheckdtlCp> finish_list = iStIvtCheckdtlCpService.list(new QueryWrapper<StIvtCheckdtlCp>().eq("check_id", form.getString("check_id")).in("status", new String[]{"99", "07"}));
//说明全部确认
if (finish_list.size() == jo_mst.getDtl_num().intValue()) {
iStIvtCheckdtlCpService.update(new UpdateWrapper<StIvtCheckdtlCp>().set("status", "99").eq("check_id", form.getString("check_id")));
jo_mst.setStatus(CHECKEnum.BILL_STATUS.code("完成"));
jo_mst.setConfirm_optid(SecurityUtils.getCurrentUserId());
jo_mst.setConfirm_optname(SecurityUtils.getCurrentNickName());
jo_mst.setConfirm_time(DateUtil.now());
//解锁起点点位、仓位
finish_list.stream()
.map(finish -> finish.getStruct_id())
.distinct()
.forEach(struct_id -> structattrService.update(new UpdateWrapper<StIvtStructattr>().set("inv_code", "").set("lock_type", "0").eq("struct_id", struct_id)));
}
this.updateById(jo_mst);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long[] ids) {
for (Long id : ids) {
StIvtCheckmstCp dao = this.getOne(new QueryWrapper<StIvtCheckmstCp>().eq("check_id", id));
dao.setIs_delete(true);
//获取所有明细下的仓位解锁
List<StIvtCheckdtlCp> dtl_list = iStIvtCheckdtlCpService.list(new QueryWrapper<StIvtCheckdtlCp>().eq("check_id", id));
dtl_list.stream()
.map(dtl -> dtl.getStruct_id())
.distinct()
.forEach(struct_id -> structattrService.update(new UpdateWrapper<StIvtStructattr>().set("inv_code", "").set("lock_type", "0").eq("struct_id", struct_id)));
this.updateById(dao);
}
}
@NotNull
private StIvtCheckmstCp packageMstForm(StIvtCheckmstCp checkmstCp, JSONObject whereJson) {
JSONArray rows = whereJson.getJSONArray("tableData");
// 新增
checkmstCp.setCheck_id(IdUtil.getStringId());
checkmstCp.setCheck_code(CodeUtil.getNewCode("PD_CODE"));
checkmstCp.setBuss_type(whereJson.getString("check_type"));
checkmstCp.setCheck_type(checkmstCp.getBuss_type());
// 获取仓库信息
QueryWrapper<StIvtBsrealstorattr> wrapper = new QueryWrapper<>();
wrapper.eq("stor_id", whereJson.getString("stor_id"));
wrapper.eq("is_used", true);
StIvtBsrealstorattr bsrealDao = stIvtBsrealstorattrService.getOne(wrapper);
if (ObjectUtil.isEmpty(bsrealDao)) throw new BadRequestException("仓库不存在或未启用!");
checkmstCp.setStor_id(bsrealDao.getStor_id());
checkmstCp.setStor_name(bsrealDao.getStor_name());
checkmstCp.setDtl_num(BigDecimal.valueOf(rows.size()));
checkmstCp.setCreate_mode(CHECKEnum.CREATE_MODE.code("PC产生"));
checkmstCp.setStatus(CHECKEnum.BILL_STATUS.code("生成"));
checkmstCp.setCreate_id(SecurityUtils.getCurrentUserId());
checkmstCp.setCreate_name(SecurityUtils.getCurrentNickName());
checkmstCp.setCreate_time(DateUtil.now());
checkmstCp.setIs_delete(false);
checkmstCp.setIs_upload(true);
// TODO 暂时写死
checkmstCp.setSysdeptid("111");
checkmstCp.setSyscompanyid("111");
checkmstCp.setRemark(whereJson.getString("remark"));
return checkmstCp;
}
}

View File

@@ -36,6 +36,13 @@ public class StIvtStructivtYlController {
return new ResponseEntity<>(structivtYlService.getRawIvt(query, page), HttpStatus.OK);
}
@GetMapping("/getProductIvt")
@Log("查询可用的成品库存")
@ApiOperation("查询可用的成品库存")
public ResponseEntity<Object> getProductIvt(StructIvtYLQuery query, PageQuery page) {
return new ResponseEntity<>(structivtYlService.getProductIvt(query,page), HttpStatus.OK);
}
@PostMapping("/getStructIvt")
@Log("查询库存")
@ApiOperation("查询库存")

View File

@@ -28,4 +28,12 @@ public interface IStIvtStructivtYlService extends IService<StIvtStructivtYl> {
Object getRawIvt(StructIvtYLQuery query, PageQuery page);
List<Map> getStructIvt(StructIvtYLQuery query);
/**
* 分页查询可用的成品库存
*
* @param query /
* @return JSONObject
*/
Object getProductIvt(StructIvtYLQuery query, PageQuery page);
}

View File

@@ -22,5 +22,7 @@ public interface StIvtStructivtYlMapper extends BaseMapper<StIvtStructivtYl> {
List<Map> getRawIvt(@Param("query") StructIvtYLQuery query, @Param("pageQuery") PageQuery pageQuery);
List<Map> getProductIvt(@Param("query") StructIvtYLQuery query, @Param("pageQuery") PageQuery pageQuery);
List<Map> getStructIvt(@Param("query") StructIvtYLQuery query);
}

View File

@@ -37,6 +37,42 @@
</where>
</select>
<select id="getProductIvt" resultType="java.util.Map">
SELECT
ivt.*,
mu.unit_name AS qty_unit_name,
mb.material_code,
mb.material_name,
sa.sect_id,
sa.sect_code,
sa.sect_name,
sa.struct_id,
sa.struct_code,
sa.struct_name,
sa.storagevehicle_code,
class.class_name
FROM
st_ivt_structivt_cp ivt
LEFT JOIN md_me_materialbase mb ON mb.material_id = ivt.material_id
LEFT JOIN st_ivt_structattr sa ON sa.struct_id = ivt.struct_id
LEFT JOIN md_pb_measureunit mu ON mu.measure_unit_id = ivt.qty_unit_id
LEFT JOIN md_pb_classstandard class ON class.class_id = mb.material_type_id
<where>
ivt.canuse_qty > 0
AND
sa.lock_type = '0'
<if test="query.material_search != null and query.material_search != ''">
and (mb.material_code = #{query.material_search} OR mb.material_name = #{query.material_search})
</if>
<if test="query.sect_id != null and query.sect_id != ''">
and sa.sect_id = #{query.sect_id}
</if>
<if test="query.struct_id != null and query.struct_id != ''">
and sa.struct_id = #{query.struct_id}
</if>
</where>
</select>
<select id="getStructIvt" resultType="java.util.Map">
SELECT
ivt.*,

View File

@@ -38,4 +38,13 @@ public class StIvtStructivtYlServiceImpl extends ServiceImpl<StIvtStructivtYlMap
public List<Map> getStructIvt(StructIvtYLQuery query) {
return this.baseMapper.getStructIvt(query);
}
@Override
public Object getProductIvt(StructIvtYLQuery query, PageQuery pageQuery) {
Page<Object> page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize());
List<Map> mst_detail = this.baseMapper.getProductIvt(query, pageQuery);
TableDataInfo<Map> build = TableDataInfo.build(mst_detail);
build.setTotalElements(page.getTotal());
return build;
}
}