Browse Source

添加库存盘点根据物料盘点功能

lwx_dev
erdanergou 3 years ago
parent
commit
f2f795dc18
  1. 6
      src/main/java/com/dreamchaser/depository_manage/controller/GroupController.java
  2. 41
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java
  3. 17
      src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java
  4. 8
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java
  5. 12
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  6. 22
      src/main/java/com/dreamchaser/depository_manage/mapper/PlaceMapper.java
  7. 39
      src/main/java/com/dreamchaser/depository_manage/mapper/PlaceMapper.xml
  8. 9
      src/main/java/com/dreamchaser/depository_manage/mapper/SplitUnitMapper.java
  9. 14
      src/main/java/com/dreamchaser/depository_manage/mapper/SplitUnitMapper.xml
  10. 14
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  11. 25
      src/main/java/com/dreamchaser/depository_manage/service/PlaceService.java
  12. 9
      src/main/java/com/dreamchaser/depository_manage/service/StockTakingService.java
  13. 34
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  14. 38
      src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java
  15. 92
      src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java
  16. 250
      src/main/resources/templates/pages/stockTaking/stockTaking.html
  17. 556
      src/main/resources/templates/pages/stockTaking/stockTakingForTable.html
  18. 12
      target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  19. 39
      target/classes/com/dreamchaser/depository_manage/mapper/PlaceMapper.xml
  20. 14
      target/classes/com/dreamchaser/depository_manage/mapper/SplitUnitMapper.xml
  21. 250
      target/classes/templates/pages/stockTaking/stockTaking.html

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

@ -123,7 +123,7 @@ public class GroupController {
// 获取详细信息
// 获取该物料的库存
List<Integer> inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo, depositoryIdList);
List<Integer> inventoryByMidAndDepository = materialService.findInventoryByGroupInfoAndDepository(groupInfo, depositoryIdList);
// 用于标志当前物料库存是否符合要求
boolean flagForQuantity = false;
for (Integer quantity : inventoryByMidAndDepository) {
@ -393,7 +393,7 @@ public class GroupController {
// 获取详细信息
// 获取该物料的库存
List<Integer> inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo, depositoryIdList);
List<Integer> inventoryByMidAndDepository = materialService.findInventoryByGroupInfoAndDepository(groupInfo, depositoryIdList);
// 用于标志当前物料库存是否符合要求
boolean flagForQuantity = false;
for (Integer quantity : inventoryByMidAndDepository) {
@ -842,7 +842,7 @@ public class GroupController {
boolean flagForInventory = false;
// 获取该物料在各仓库的库存
List<Integer> inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo, depositoryIdList);
List<Integer> inventoryByMidAndDepository = materialService.findInventoryByGroupInfoAndDepository(groupInfo, depositoryIdList);
for (Integer integer : inventoryByMidAndDepository) {
if (integer >= totalQuantity) {
flagForInventory = true;

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

@ -18,7 +18,6 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* @author Dreamchaser
@ -84,9 +83,6 @@ public class MaterialController {
}
/**
* 用于查询当前组合中物料的数量
*
@ -1861,6 +1857,43 @@ public class MaterialController {
}
@GetMapping("/findMaterialByConditionForStockTaking")
public RestResponse findMaterialByConditionForStockTaking(@RequestParam Map<String, Object> map, HttpServletRequest request) {
if (map.containsKey("mid")) {
String mid = (String) map.get("mid");
if("".equals(mid)){
return new RestResponse(null);
}
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
// 获取当前部门所拥有的仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString());
// 查询当前用户管理的仓库
List<RoleAndDepository> depositoryAndRole = roleService.findDepositoryAndRole(userToken.getId());
// 获取用户可见的仓库
List<Integer> depositoryIdList = new ArrayList<>();
for (Depository depository : depositoryByAdminorg
) {
depositoryIdList.add(depository.getId());
}
for (RoleAndDepository rad : depositoryAndRole
) {
if (!depositoryIdList.contains(rad.getDepositoryId())) {
depositoryIdList.add(rad.getDepositoryId());
}
}
map.put("userTokenId",userToken.getId());
List<MaterialAndPlaceForView> materialAndPlaceForViews = materialService.findInventoryByMidAndDepository(map, depositoryIdList);
Integer count = placeService.findPlaceAndMaterialCountByDidsAndMid(depositoryIdList, map);
return new RestResponse(materialAndPlaceForViews,count,200);
}else{
return new RestResponse(null);
}
}
/**
* 用于修改对应的码值类型
*

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

@ -53,8 +53,7 @@ public class StockTakingController {
// 用于添加盘点记录
@PostMapping("/addStockTakingRecord")
public RestResponse addStockTakingRecord(@RequestBody Map<String,Object> map, HttpServletRequest request)
{
public RestResponse addStockTakingRecord(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
@ -154,8 +153,7 @@ public class StockTakingController {
}
}).start();
}
else{
} else {
// 如果只有一个表
success += stockTakingService.insertStockTaking(map);
Object mainId = map.get("mainId");
@ -195,8 +193,7 @@ public class StockTakingController {
if (params.size() > 0) {
return CrudUtil.postHandle(success, params.size() + 1);
}
else{
} else {
return CrudUtil.postHandle(success, 1);
}
}
@ -319,6 +316,8 @@ public class StockTakingController {
size = keys.size();
// 定义用于插入的盘点记录
Map<String, Object> param = new HashMap<>();
// 如果是指定位置
if (map.containsKey("depositoryId")) {
// 如果存在
for (String key : keys) {
Boolean flagForSubmit = ObjectFormatUtil.toBoolean(redisTemplateForHash.opsForHash().get(key, "flagForSubmit"));
@ -364,6 +363,12 @@ public class StockTakingController {
redisTemplateForHash.opsForHash().put(key, "flagForSubmit", "true");
}
}
else{
// 如果是非指定位置
success = stockTakingService.insertStockTakingByMaterial(map, keys, userToken);
}
}
return CrudUtil.putHandle(success, size);
}
}

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

@ -160,6 +160,14 @@ public interface MaterialMapper {
*/
Inventory findInventoryByMidAndDid(Map<String,Object> map);
/**
* 根据物料id与仓库id列表查询库存信息
* @param map 查询条件
* @return
*/
List<Inventory> findInventoryByMidAndDids(Map<String,Object> map);
/**
* 根据id查询库存信息
* @param id 库存id

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

@ -674,6 +674,18 @@
and depositoryId = #{did}
</select>
<select id="findInventoryByMidAndDids" resultMap="InventoryMap" parameterType="map">
select
<include refid="allColumnsAndTypeNameOnViewByInventory" />
from findInventory
where
mid = #{mid}
and depositoryId in
<foreach collection="list" index="index" item="did" open="(" separator="," close=")">
#{did}
</foreach>
</select>
<select id="findMaterialAndTypeById" resultMap="materialAndTypeMap" parameterType="integer">
select
<include refid="allColumnsAndTypeName"/>

22
src/main/java/com/dreamchaser/depository_manage/mapper/PlaceMapper.java

@ -143,6 +143,28 @@ public interface PlaceMapper {
*/
List<MaterialAndPlaceForView> findPlaceAndMaterialByDidAndMid(Map<String,Object> map);
/**
* 根据仓库id及物料id获取对应库位存储的物料
* @param map 待查询条件
* @return
*/
List<MaterialAndPlaceForView> findPlaceAndMaterialByDidsAndMid(Map<String,Object> map);
/**
* 根据主键获取物料与库位的对应关系的具体数据
* @param id 待查询id
* @return
*/
MaterialAndPlaceForView findPlaceAndMaterialForViewById(Integer id);
/**
* 根据仓库id及物料id获取对应库位存储的物料数量
* @param map 待查询的其他数据
* @return
*/
Integer findPlaceAndMaterialCountByDidsAndMid(Map<String,Object> map);
/**
* 根据条件获取对应库位存储的物料
* @param map 待查询条件

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

@ -115,6 +115,45 @@
and pstate != 3
</select>
<select id="findPlaceAndMaterialByDidsAndMid" resultMap="MaterialAndPlaceForViewMap" parameterType="map">
select
<include refid="allColumnsForView"/>
FROM materialandplaceinfo WHERE 1 = 1
<if test="mid != '' and mid != null">
and mid = #{mid}
</if>
and depository_id in
<foreach collection="list" index="index" item="did" open="(" separator="," close=")">
#{did}
</foreach>
and pstate != 3
<if test="begin != null and size != null">
LIMIT #{begin},#{size}
</if>
</select>
<select id="findPlaceAndMaterialForViewById" resultMap="MaterialAndPlaceForViewMap" parameterType="int">
select
<include refid="allColumnsForView"/>
FROM materialandplaceinfo WHERE id = #{id}
</select>
<select id="findPlaceAndMaterialCountByDidsAndMid" resultType="int" parameterType="map">
select
COUNT(*)
FROM materialandplaceinfo WHERE 1 = 1
<if test="mid != '' and mid != null">
and mid = #{mid}
</if>
and depository_id in
<foreach collection="list" index="index" item="did" open="(" separator="," close=")">
#{did}
</foreach>
and pstate != 3
</select>
<select id="findPlaceAndMaterialByCondition" parameterType="map" resultMap="MaterialAndPlaceForViewMap">
select
<include refid="allColumnsForView"/>

9
src/main/java/com/dreamchaser/depository_manage/mapper/SplitUnitMapper.java

@ -97,6 +97,15 @@ public interface SplitUnitMapper {
SplitInventory findSplitInventoryByIidAndSid(Map<String,Object> map);
/**
* 通过物料库存id与拆单id列表获取拆单库存操作记录
* @param map 查询条件
* @return
*/
List<SplitInventory> findSplitInventoryByIidAndSids(Map<String,Object> map);
/**
* 根据条件查询对应拆单详细信息
* @param map 查询条件

14
src/main/java/com/dreamchaser/depository_manage/mapper/SplitUnitMapper.xml

@ -103,6 +103,20 @@
</if>
</select>
<select id="findSplitInventoryByIidAndSids" parameterType="map" resultMap="splitInventoryMap">
select
<include refid="splitInventoryAllColumns"/>
from `split_inventory` si
where 1 = 1
<if test="iid != null ">
and si.iid = #{iid}
</if>
and si.sid in
<foreach collection="list" index="index" item="sid" open="(" separator="," close=")">
#{sid}
</foreach>
</select>
<select id="findSplitInventoryBySid" parameterType="int" resultMap="splitInventoryMap">
select
<include refid="splitInventoryAllColumns"/>

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

@ -147,7 +147,19 @@ public interface MaterialService {
* @param depositoryList 待查询的仓库
* @return
*/
List<Integer> findInventoryByMidAndDepository(GroupInfo groupInfo,List<Integer> depositoryList);
List<Integer> findInventoryByGroupInfoAndDepository(GroupInfo groupInfo, List<Integer> depositoryList);
/**
* 根据物料id获取其在对应仓库中的库存数
*
* @param map 待查询物料id及其他数据
* @param depositoryList 待查询的仓库
* @return
*/
List<MaterialAndPlaceForView> findInventoryByMidAndDepository(Map<String,Object> map, List<Integer> depositoryList);
/**
* 根据id查询库存信息

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

@ -124,6 +124,22 @@ public interface PlaceService {
*/
List<MaterialAndPlaceForView> findPlaceAndMaterialByDidAndMid(Integer did, Integer mid);
/**
* 根据仓库id及物料id获取对应库位存储的物料
* @param dids 待查询仓库id列表
* @param map 待查询的其他数据
* @return
*/
List<MaterialAndPlaceForView> findPlaceAndMaterialByDidsAndMid(List<Integer> dids, Map<String,Object> map);
/**
* 根据仓库id及物料id获取对应库位存储的物料数量
* @param dids 待查询仓库id列表
* @param map 待查询的其他数据
* @return
*/
Integer findPlaceAndMaterialCountByDidsAndMid(List<Integer> dids, Map<String,Object> map);
/**
* 根据条件获取对应库位存储的物料
* @param map 待查询条件
@ -149,6 +165,15 @@ public interface PlaceService {
*/
MaterialAndPlace findPlaceAndMaterialById(Integer id);
/**
* 根据主键获取物料与库位的对应关系的具体数据
* @param id 待查询id
* @return
*/
MaterialAndPlaceForView findPlaceAndMaterialForViewById(Integer id);
/**
* 添加物料到库位
* @param map

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

@ -10,6 +10,7 @@ import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_tem
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.Set;
public interface StockTakingService {
/**
@ -19,6 +20,14 @@ public interface StockTakingService {
*/
Integer insertStockTaking(Map<String,Object> map);
/**
* 用于插入盘点记录用于通过物料盘点时
* @param map
* @return
*/
Integer insertStockTakingByMaterial(Map<String,Object> map, Set<String> keys,UserByPort userToken);
/**
* 用于插入盘点记录主表
* @param st

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

@ -519,7 +519,7 @@ public class MaterialServiceImpl implements MaterialService {
* @return
*/
@Override
public List<Integer> findInventoryByMidAndDepository(GroupInfo groupInfo, List<Integer> depositoryList) {
public List<Integer> findInventoryByGroupInfoAndDepository(GroupInfo groupInfo, List<Integer> depositoryList) {
// 用于存储各仓库的库存
List<Integer> result = new ArrayList<>();
// 获取当前物料在组合中的单位
@ -572,6 +572,29 @@ public class MaterialServiceImpl implements MaterialService {
return result;
}
/**
* 根据物料id获取其在对应仓库中的库存数
*
* @param map 待查询物料id
* @param depositoryList 待查询的仓库
* @return
*/
@Override
public List<MaterialAndPlaceForView> findInventoryByMidAndDepository(Map<String, Object> map, List<Integer> depositoryList) {
Integer mid = ObjectFormatUtil.toInteger(map.get("mid"));
// 获取当前物料的所有拆单记录
List<SplitInfo> splitInfoList = splitUnitMapper.findSplitInfoByMid(mid);
// 定义参数用于获取当前物料在仓库下的各库位记录
List<MaterialAndPlaceForView> placeAndMaterialByDidsAndMid = placeService.findPlaceAndMaterialByDidsAndMid(depositoryList, map);
if (placeAndMaterialByDidsAndMid.size() > 0) {
// 如果存在库存记录
return packMpvList(placeAndMaterialByDidsAndMid,map);
}
return null;
}
/**
* 根据id查询库存信息
*
@ -2614,8 +2637,12 @@ public class MaterialServiceImpl implements MaterialService {
map.remove("placeId");
}
List<MaterialAndPlaceForView> placeAndMaterialByCondition = placeService.findPlaceAndMaterialByCondition(map);
return packMpvList(placeAndMaterialByCondition,map);
}
for (MaterialAndPlaceForView mpv : placeAndMaterialByCondition
List<MaterialAndPlaceForView> packMpvList(List<MaterialAndPlaceForView> materialAndPlaceForViewList,Map<String,Object> map){
for (MaterialAndPlaceForView mpv : materialAndPlaceForViewList
) {
// 获取其对应的拆单记录
List<SplitInfo> list = splitUnitMapper.findSplitInfoByMid(mpv.getMid());
@ -2670,9 +2697,10 @@ public class MaterialServiceImpl implements MaterialService {
// 设置盘点结果
mpv.setTakingResult(takingResult);
}
return placeAndMaterialByCondition;
return materialAndPlaceForViewList;
}
// 构造树形组件数据模板(通过物料名称搜索)
public Map<String, Object> InitTreeMenusForSelectName(MaterialType mt, List<Object> children) {
if (mt != null) {

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

@ -287,8 +287,39 @@ public class PlaceServiceImpl implements PlaceService {
return placeMapper.findPlaceAndMaterialByDidAndMid(map);
}
/**
* 根据仓库id及物料id获取对应库位存储的物料
*
* @param dids 待查询仓库id列表
* @param map 待查询的其他数据
* @return
*/
@Override
public List<MaterialAndPlaceForView> findPlaceAndMaterialByDidsAndMid(List<Integer> dids, Map<String, Object> map) {
Integer size = 10, page = 1;
if (map.containsKey("size")) {
size = ObjectFormatUtil.toInteger(map.get("size"));
map.put("size", size);
}
if (map.containsKey("page")) {
page = ObjectFormatUtil.toInteger(map.get("page"));
map.put("begin", (page - 1) * size);
}
map.put("list", dids);
return placeMapper.findPlaceAndMaterialByDidsAndMid(map);
}
@Override
public Integer findPlaceAndMaterialCountByDidsAndMid(List<Integer> dids, Map<String, Object> map) {
map.put("list", dids);
return placeMapper.findPlaceAndMaterialCountByDidsAndMid(map);
}
/**
* 根据条件获取对应库位存储的物料
*
* @param map 待查询条件
* @return
*/
@ -299,6 +330,7 @@ public class PlaceServiceImpl implements PlaceService {
/**
* 根据条件获取对应库位存储的物料数量
*
* @param map 待查询条件
* @return
*/
@ -327,6 +359,12 @@ public class PlaceServiceImpl implements PlaceService {
return placeMapper.findPlaceAndMaterialById(id);
}
@Override
public MaterialAndPlaceForView findPlaceAndMaterialForViewById(Integer id) {
return placeMapper.findPlaceAndMaterialForViewById(id);
}
/**
* 添加物料到库位
*

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

@ -5,10 +5,7 @@ import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.mapper.*;
import com.dreamchaser.depository_manage.pojo.RestResponse;
import com.dreamchaser.depository_manage.pojo.SimpleStockTakingP;
import com.dreamchaser.depository_manage.pojo.StatusInfo;
import com.dreamchaser.depository_manage.pojo.StockTakingChildP;
import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo_Details;
import com.dreamchaser.depository_manage.pojo.callBackXml.approvalCallBackXml.ApprovalInfo_Details_Approver;
import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard;
@ -133,6 +130,93 @@ public class StockTakingServiceImpl implements StockTakingService {
return stockTakingMapper.insertStockTakingChild(map);
}
/**
* 用于插入盘点记录用于通过物料盘点时
*
* @param map
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public Integer insertStockTakingByMaterial(Map<String, Object> map, Set<String> keys,UserByPort userToken) {
int success = 0;
// 定义用于存储仓库与当前对应关系的map
Map<String, List<MaterialAndPlaceForView>> paramForDepositoryAndPid = new HashMap<>();
for (String key : keys) {
Boolean flagForSubmit = ObjectFormatUtil.toBoolean(redisTemplate.opsForHash().get(key, "flagForSubmit"));
if (flagForSubmit != null && !flagForSubmit) {
// 获取盘点时的物料与库位的对应关系id
Integer id = ObjectFormatUtil.toInteger(redisTemplate.opsForHash().get(key, "id"));
// 获取物料与库位的对应关系
MaterialAndPlaceForView placeAndMaterial = placeMapper.findPlaceAndMaterialForViewById(id);
// 获取对应的仓库编码
String dcode = placeAndMaterial.getDcode();
// 判断该仓库是否已经存在
List<MaterialAndPlaceForView> materialAndPlaceForViews = paramForDepositoryAndPid.get(dcode);
if (materialAndPlaceForViews != null && materialAndPlaceForViews.size() > 0) {
// 如果已经存在
// 添加
materialAndPlaceForViews.add(placeAndMaterial);
} else {
// 如果不存在
List<MaterialAndPlaceForView> list = new ArrayList<>();
list.add(placeAndMaterial);
paramForDepositoryAndPid.put(dcode, list);
}
}
}
if (paramForDepositoryAndPid.size() > 0) {
Set<String> strings = paramForDepositoryAndPid.keySet();
for (String string : strings
) {
List<MaterialAndPlaceForView> materialAndPlaceForViews = paramForDepositoryAndPid.get(string);
// 定义用于插入的盘点记录
Map<String, Object> param = new HashMap<>();
for (MaterialAndPlaceForView mpv:materialAndPlaceForViews
) {
String key = "wms_stockTaking_" + userToken.getId() + "_" + DateUtil.getNowTime() + "_"+mpv.getId();
Object unit = redisTemplate.opsForHash().get(key, "unit");
String takingResult = (String) redisTemplate.opsForHash().get(key, "takingResult");
Object number = redisTemplate.opsForHash().get(key, "number");
Object oldInventory = redisTemplate.opsForHash().get(key, "oldInventory");
Integer newInventory = ObjectFormatUtil.toInteger(oldInventory);
if ("Inventory_down".equals(takingResult)) {
// 如果盘亏
newInventory -= ObjectFormatUtil.toInteger(number);
} else if ("Inventory_up".equals(takingResult)) {
// 如果盘盈
newInventory += ObjectFormatUtil.toInteger(number);
}
param.put("newInventory", newInventory);
param.put("depositoryId", mpv.getDepository_id().toString());
param.put("placeId", mpv.getPid().toString());
param.put("departmentManager", map.get("departmentManager"));
param.put("state", 3);
param.put("departmentManagerState", 3);
param.put("originator", userToken.getId());
param.put("mid", mpv.getIid());
param.put("oldInventory", oldInventory);
param.put("takingResult", takingResult);
param.put("inventory", number);
param.put("unit", unit);
success += insertStockTaking(param);
param.remove("id");
redisTemplate.opsForHash().put(key, "flagForSubmit", "true");
}
}
}
return success;
}
/**
* 用于插入盘点记录主表
*

250
src/main/resources/templates/pages/stockTaking/stockTaking.html

@ -57,22 +57,41 @@
lay-filter="form1" id="form1">
<div class="layui-card-body" id="takingHeader" style="padding-right: 0px">
<div class="layui-form-item">
<label class="layui-form-label" style="height: 40px;">盘点位置:</label>
<div class="layui-input-block">
<label class="layui-form-label" style="height: 40px;">物料名称:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input type="text" placeholder="请选择盘点位置" class="layui-input"
<input type="text" placeholder="请选择物料" class="layui-input"
style="border-style: none"
id="openSonByDepository" readonly
id="openSonByMaterial"
onblur="selectMaterialByName(this)"
lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanCodeImg"
style="margin-top: 10px" onclick="scanCode(this)">
<i class="layui-icon layui-icon-search"
style="display: inline;"
id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name="depositoryId" class="layui-input"
id="depositoryId"
style="display: none" lay-verify="required"/>
<input type="text" name="placeId" class="layui-input" id="placeId"
<input type="text" name="mid" class="layui-input" id="mid"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="height: 40px;">物料编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="code" name="code" type="text"
placeholder="请填写入物料编码"
value=""
onblur="selectCode(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
id="qrCodeImg"
style="margin-top: 10px"
onclick="scanCodeInStorage(this)">
<input id="qrCode" name="qrCode" type="text"
style="display:none;">
</div>
</div>
</div>
<div class="layui-form-item">
@ -177,7 +196,6 @@
}
// 用于存储当前选择的盘点位置
let depositoryId;
let placeId;
@ -230,54 +248,12 @@
}
});
// 用于打开仓库树形菜单
$('#openSonByDepository').on('click', function () {
layer.open({
type: 2,
title: '弹窗内容',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['70%', '70%'],
move: '.layui-layer-title',
fixed: false,
content: '/selectDepository?type=2',
success: function (layero, index) {
var children = layero.children();
var content = $(children[1]);
var iframeChildren = $(content.children());
content.css('height', '100%');
iframeChildren.css('height', '100%');
},
end: function () {
var nowDepositoryId = $("#depositoryId").val();
var nowPlaceId = $("#placeId").val();
if (nowDepositoryId !== depositoryId || nowPlaceId !== placeId) {
// 如果重新选择盘点位置
var nowDepositoryName = $("#openSonByDepository").val();
$("#form1")[0].reset();
$("#depositoryId").val(nowDepositoryId);
$("#placeId").val(nowPlaceId);
$("#openSonByDepository").val(nowDepositoryName);
form.render();
}
if (nowDepositoryId !== null && nowDepositoryId !== "") {
depositoryId = nowDepositoryId;
placeId = nowPlaceId;
updateTableShow();
}
}
});
});
updateTableShow = function () {
let req = {};
req.depositoryId = depositoryId;
req.placeId = placeId;
req.mid = $("#mid").val();
table.reload('currentTableId', {
url: '/material/findInventoryForStockTaking',
url: '/material/findMaterialByConditionForStockTaking',
page: {
curr: 1
},
@ -287,7 +263,7 @@
table.render({
elem: "#currentTableId",
url: '/material/findInventoryForStockTaking',
url: '/material/findMaterialByConditionForStockTaking',
parseData: function (res) { //res 即为原始返回的数据
return {
"status": res.status, //解析接口状态
@ -313,10 +289,11 @@
height: 'full-255',//固定高度-即固定表头固定第一行首行
cols: [
[
{field: 'mcode', width: 150, title: '存货编码', fixed: 'left'},
{field: 'mcode', width: 100, title: '存货编码', fixed: 'left'},
{field: 'mname', width: 150, title: '物料名称'},
{field: 'typeName', width: 100, title: '物料种类'},
{field: 'version', width: 150, title: '规格型号',},
{field: 'tname', width: 120, title: '物料种类'},
{field: 'dname', width: 150, title: '所处仓库'},
{field: 'pcode', width: 150, title: '所处库位',},
{title: '计量单位', width: 200, templet: '#changeUnit', align: "center"},
{field: 'inventory', width: 100, title: '库存数'},
@ -334,8 +311,8 @@
let takingUnit = j["takingUnit"];
if (takingUnit !== null) {
let parentItem = $("[lay-id='currentTableId'] tr:eq(" + (i + 1) + ")");
let unitHandleItem = parentItem.children()[5];
let quantityHandleItem = parentItem.children()[6];
let unitHandleItem = parentItem.children()[6];
let quantityHandleItem = parentItem.children()[7];
unitHandleItem.childNodes[0].childNodes[1].childNodes[0].data = takingUnit;
quantityHandleItem.childNodes[0].innerText = j["splitInventory"][takingUnit];
}
@ -416,64 +393,6 @@
});
// 扫码盘点位置
scanCode = function () {
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
req.codeFlag = 2;
$.ajax({
url: "/place/qywxApplicationInScanQrCode",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
var flag = data["flag"];
if (flag === 0) {
// 如果没有获取到位置
layer.msg("并未查询到对应位置,请重新扫描", {
icon: 0,
time: 1000
}, function () {
depositoryId = -1;
placeId = -1;
});
} else if (flag === 1) {
// 如果获取到的是库位
var place = data["place"];
$("#placeId").val(place.id);
$("#openSonByDepository").val(place.depositoryName);
$("#depositoryId").val(place.did);
depositoryId = place.did;
placeId = place.id;
} else if (flag === 2) {
// 如果获取到的是仓库
var depository = data["depository"];
$("#placeId").val("0");
$("#openSonByDepository").val(depository.dname);
$("#depositoryId").val(depository.id);
depositoryId = depository.id;
placeId = "0";
}
updateTableShow();
}
})
}
})
};
table.on('edit(currentTableFilter)', function (obj) {
obj.update({stockTakingQuantity: obj.value});//修改当前行数据
calculate(obj);
@ -500,7 +419,7 @@
, data: dropDownDataList
, click: function (unit) {
this.elem[0].childNodes[0].data = unit.title;
obj.tr[0].childNodes[6].childNodes[0].innerText = obj.data.splitInventory[unit.title];
obj.tr[0].childNodes[7].childNodes[0].innerText = obj.data.splitInventory[unit.title];
}
, align: 'right' //右对齐弹出(v2.6.8 新增)
, style: 'box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);' //设置额外样式
@ -513,7 +432,7 @@
// 用于计算盘点结果
calculate = function (obj) {
let oldInventory = Number(obj.tr[0].childNodes[6].childNodes[0].innerText);
let oldInventory = Number(obj.tr[0].childNodes[7].childNodes[0].innerText);
let nowInventory = Number(obj.value);
let number = 0;
let takingResult = '';
@ -531,15 +450,15 @@
takingResult = "Inventory_normal";
takingResultString = "正常";
}
obj.tr[0].childNodes[8].childNodes[0].innerText = takingResultString;
obj.tr[0].childNodes[9].childNodes[0].innerText = number;
obj.tr[0].childNodes[9].childNodes[0].innerText = takingResultString;
obj.tr[0].childNodes[10].childNodes[0].innerText = number;
obj.update({takingResult: takingResult});
obj.update({takingInventory: number});
req.number = number + "";
req.takingResult = takingResult;
req.takingResultString = takingResultString;
req.id = obj.data.id + "";
req.unit = obj.tr[0].childNodes[5].childNodes[0].innerText;
req.unit = obj.tr[0].childNodes[6].childNodes[0].innerText;
req.oldInventory = oldInventory+"";
$.ajax({
url: "/stockTaking/temporaryStorageForTakingResult",
@ -549,6 +468,89 @@
contentType: "application/json;charset=utf-8"
});
};
// 用于通过物料名称获取物料
selectMaterialByName = function (obj) {
// 输入code
var data = obj.value;
var req = {};
data = data.split(",")[0];
if(data !== ""){
req.mname = data;
$.ajax({
url: "/material/findMaterialByCondition",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
if (d.count > 1) {
layer.msg("请点击右侧搜索确定物品");
$("#openSonByMaterial").val("");
$("#mid").val("");
$("#code").val("");
return false;
} else if (d.count === 0) {
layer.msg("没有该物品,请确认输入是否正确");
$("#openSonByMaterial").val("");
$("#mid").val("");
$("#code").val("");
return false;
} else {
var material = d.data[0];
$("#openSonByMaterial").val(material.mname);
$("#mid").val(material.mid);
$("#code").val(material.code);
form.render();
updateTableShow();
}
}
});
}
};
// 用于实现通过编码查询物料
selectCode = function (obj) {
// 输入code
var code = obj.value;
var req = {};
req.code = code;
req.type = "out";
if(code !== ""){
$.ajax({
url: "/material/findMatrialByCode",
type: "get",
dataType: 'json',
data: (req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var d = d.data;
if (d == null) {
layer.msg("仓库中暂无该物料",{
icon:0,
time:1000
},function () {
$("#openSonByMaterial").val("");
$("#mid").val("");
$("#code").val("");
updateTableShow();
});
} else {
$("#openSonByMaterial").val(d.mname);
$("#mid").val(d.mid);
form.render();
updateTableShow();
}
}
});
}
};
});
</script>

556
src/main/resources/templates/pages/stockTaking/stockTakingForTable.html

@ -0,0 +1,556 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>仓库盘点</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
<link rel="stylesheet" href="/static/js/lay-module/step-lay/step.css" media="all">
<link rel="stylesheet" href="/static/css/inputTag.css">
<style>
.inputdiv {
display: flex;
background-color: #fff;
height: 38px;
line-height: 38px;
border: 1px solid rgb(238, 238, 238);
}
.layui-card-body {
padding: 0px;
}
.layui-form-label {
padding: 9px 0px;
text-align: left;
}
.layui-input-block {
margin-left: 80px;
}
.layui-form-select {
width: 100%;
border-style: none;
}
.lay-step {
display: none;
}
</style>
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto; ">
<div carousel-item style="overflow: inherit">
<div>
<div class="layui-fluid">
<div class="layui-card">
<form class="layui-form"
style="margin: 0 auto;max-width: 700px;"
lay-filter="form1" id="form1">
<div class="layui-card-body" id="takingHeader" style="padding-right: 0px">
<div class="layui-form-item">
<label class="layui-form-label" style="height: 40px;">盘点位置:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择盘点位置" class="layui-input"
style="border-style: none"
id="openSonByDepository" readonly
lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanCodeImg"
style="margin-top: 10px" onclick="scanCode(this)">
</div>
<input type="text" name="depositoryId" class="layui-input"
id="depositoryId"
style="display: none" lay-verify="required"/>
<input type="text" name="placeId" class="layui-input" id="placeId"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="height: 40px;">负责人:</label>
<div class="layui-input-block">
<div class="fairy-tag-container" style="border-style: none">
<div class="inputdiv">
<input type="text" id="departmentManager" style="display: none"
th:value="${departmentHeadName}"/>
<i class="layui-icon layui-icon-search"
style="display: inline;right: 0;position: absolute;"
id="selectdepartmentManager"></i>
<input type="text" id="departmentManagerId"
name="departmentManagerId"
th:value="${departmentHeadId}"
class="layui-input" style="display: none"
lay-verify="required"/>
</div>
</div>
</div>
</div>
</div>
</form>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"
style="margin-top: 123px"></table>
<!-- 提交按钮-->
<div class="layui-form-item" style="margin-top: 10px;">
<div class="layui-input-block">
<button type="button" class="layui-btn layui-btn-normal layui-btn-lg"
lay-submit
lay-filter="formStep">
&emsp;提交&emsp;
</button>
</div>
</div>
</div>
</div>
</div>
<!-- 下一步-->
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div style="text-align: center;margin-top: 90px;">
<i class="layui-icon layui-circle"
style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i>
<div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
提交成功
</div>
<div style="text-align: center;margin-top: 50px;">
<button class="layui-btn next">再填写一次</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script id="changeUnit" type="text/html">
<a class="layui-btn layui-btn-xs" lay-event="more">{{d.unit}}<i class="layui-icon layui-icon-down"></i></a>
</script>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script>
// 用于添加标签
function addItem(obj) {
}
// 用于删除标签
function deleteItem(obj) {
}
// 用于扫描条形码或二维码
function scanCode(obj) {
}
// 用于加载物料选择菜单
function selectMaterial() {
}
// 用于通过物料名称获取物料
function selectMaterialByName() {
}
// 用于编码查询
function selectCode(obj) {
}
// 用于计算盘点结果
function calculate(obj) {
}
function updateTableShow() {
}
// 用于存储当前选择的盘点位置
let depositoryId;
let placeId;
// 用于存储当前选择的负责人
let departmentManagerId;
layui.use(['form', 'step', 'flow', 'table', 'inputTag'], function () {
var $ = layui.$,
form = layui.form,
table = layui.table,
inputTag = layui.inputTag,
dropdown = layui.dropdown, //下拉菜单
step = layui.step;
departmentManagerId = $("#departmentManagerId").val();
// 用于分步表单加载
step.render({
elem: '#stepForm',
filter: 'stepForm',
width: '100%', //设置容器宽度
height: '900px',
stepItems: [{
title: '填写信息'
}, {
title: '提交成功'
}]
});
let tagData = [];
let tempData = $("#departmentManager").val().split(",");
$.each(tempData, function (index, item) {
if (item !== "") {
tagData.push(item)
}
});
$("#departmentManager").val("");
let tagLabel = inputTag.render({
elem: '#departmentManager',
data: tagData,//初始值
removeKeyNum: 8,//删除按键编号 默认,BackSpace 键
createKeyNum: 13,//创建按键编号 默认,Enter 键
onChange: function (data, value, type, index) {
if (type === "remove") {
let split = departmentManagerId.split(",");
split.splice(index, 1);
departmentManagerId = split.toString();
$("#departmentManagerId").val(departmentManagerId);
}
}
});
// 用于打开仓库树形菜单
$('#openSonByDepository').on('click', function () {
layer.open({
type: 2,
title: '弹窗内容',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['70%', '70%'],
move: '.layui-layer-title',
fixed: false,
content: '/selectDepository?type=2',
success: function (layero, index) {
var children = layero.children();
var content = $(children[1]);
var iframeChildren = $(content.children());
content.css('height', '100%');
iframeChildren.css('height', '100%');
},
end: function () {
var nowDepositoryId = $("#depositoryId").val();
var nowPlaceId = $("#placeId").val();
if (nowDepositoryId !== depositoryId || nowPlaceId !== placeId) {
// 如果重新选择盘点位置
var nowDepositoryName = $("#openSonByDepository").val();
$("#form1")[0].reset();
$("#depositoryId").val(nowDepositoryId);
$("#placeId").val(nowPlaceId);
$("#openSonByDepository").val(nowDepositoryName);
form.render();
}
if (nowDepositoryId !== null && nowDepositoryId !== "") {
depositoryId = nowDepositoryId;
placeId = nowPlaceId;
updateTableShow();
}
}
});
});
updateTableShow = function () {
let req = {};
req.depositoryId = depositoryId;
req.placeId = placeId;
table.reload('currentTableId', {
url: '/material/findInventoryForStockTaking',
page: {
curr: 1
},
where: req
}, 'data');
};
table.render({
elem: "#currentTableId",
url: '/material/findInventoryForStockTaking',
parseData: function (res) { //res 即为原始返回的数据
return {
"status": res.status, //解析接口状态
"message": res.statusInfo.message, //解析提示文本
"count": res.count, //解析数据长度
"data": res.data //解析数据列表
};
},
request: {
pageName: 'page', //页码的参数名称,默认:page
limitName: 'size' //每页数据量的参数名,默认:limit
},
response: {
statusName: 'status' //规定数据状态的字段名称,默认:code
, statusCode: 200 //规定成功的状态码,默认:0
, msgName: 'message' //规定状态信息的字段名称,默认:msg
, countName: 'count' //规定数据总数的字段名称,默认:count
, dataName: 'data' //规定数据列表的字段名称,默认:data
},
where: {
depositoryId: "-1"
},
height: 'full-255',//固定高度-即固定表头固定第一行首行
cols: [
[
{field: 'mcode', width: 150, title: '存货编码', fixed: 'left'},
{field: 'mname', width: 150, title: '物料名称'},
{field: 'typeName', width: 100, title: '物料种类'},
{field: 'version', width: 150, title: '规格型号',},
{field: 'pcode', width: 150, title: '所处库位',},
{title: '计量单位', width: 200, templet: '#changeUnit', align: "center"},
{field: 'inventory', width: 100, title: '库存数'},
{field: 'stockTakingQuantity', width: 100, title: '盘点数', edit: 'quantity'},
{field: 'takingResultString', width: 100, title: '盘点结果'},
{field: 'takingInventory', width: 100, title: '盈亏数量'},
]
],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: true,
skin: 'line',
done: function (res, curr, count) {
$.each(res['data'], function (i, j) {
let takingUnit = j["takingUnit"];
if (takingUnit !== null) {
let parentItem = $("[lay-id='currentTableId'] tr:eq(" + (i + 1) + ")");
let unitHandleItem = parentItem.children()[5];
let quantityHandleItem = parentItem.children()[6];
unitHandleItem.childNodes[0].childNodes[1].childNodes[0].data = takingUnit;
quantityHandleItem.childNodes[0].innerText = j["splitInventory"][takingUnit];
}
});
}
});
// 用于打开负责人树形菜单
$("#selectdepartmentManager").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: '/selectManager',
end: function () {
departmentManagerId = $("#departmentManagerId").val();
tagLabel.createItem();
},
success: function (layero, index) {
var children = layero.children();
var content = $(children[1]);
var iframeChildren = $(content.children());
content.css('height', '100%');
iframeChildren.css('height', '100%');
}
});
});
// 用于提交盘点情况
form.on('submit(formStep)', function (data) {
data = data.field;
data.depositoryId = depositoryId;
data.placeId = placeId;
data.departmentManager = departmentManagerId;
$.ajax({
url: "/stockTaking/submitStockTaking",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(data),
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (data) {
layer.msg("申请提交成功", {
icon: 6,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒)
}, function () {
step.next('#stepForm');
});
},
complete: function () {
layer.close(this.layerIndex);
}
});
});
form.on('submit(formStep2)', function (data) {
step.next('#stepForm');
return false;
});
$('.pre').click(function () {
step.pre('#stepForm');
});
$('.next').click(function () {
step.next('#stepForm');
});
// 扫码盘点位置
scanCode = function () {
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
req.codeFlag = 2;
$.ajax({
url: "/place/qywxApplicationInScanQrCode",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
var flag = data["flag"];
if (flag === 0) {
// 如果没有获取到位置
layer.msg("并未查询到对应位置,请重新扫描", {
icon: 0,
time: 1000
}, function () {
depositoryId = -1;
placeId = -1;
});
} else if (flag === 1) {
// 如果获取到的是库位
var place = data["place"];
$("#placeId").val(place.id);
$("#openSonByDepository").val(place.depositoryName);
$("#depositoryId").val(place.did);
depositoryId = place.did;
placeId = place.id;
} else if (flag === 2) {
// 如果获取到的是仓库
var depository = data["depository"];
$("#placeId").val("0");
$("#openSonByDepository").val(depository.dname);
$("#depositoryId").val(depository.id);
depositoryId = depository.id;
placeId = "0";
}
updateTableShow();
}
})
}
})
};
table.on('edit(currentTableFilter)', function (obj) {
obj.update({stockTakingQuantity: obj.value});//修改当前行数据
calculate(obj);
});
// 用于监听下拉菜单
table.on('tool(currentTableFilter)', function (obj) { //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
var data = obj.data //获得当前行数据
, layEvent = obj.event; //获得 lay-event 对应的值
if (layEvent === 'more') {
let splitInfoList = obj.data.splitInfoList;
if (splitInfoList.length > 0) {
let dropDownDataList = [];
for (var i = 0; i < splitInfoList.length; i++) {
let dropDownData = {};
dropDownData.title = splitInfoList[i].newUnit;
dropDownData.id = obj.data.id;
dropDownDataList.push(dropDownData);
}
dropdown.render({
elem: this //触发事件的 DOM 对象
, show: true //外部事件触发即显示
, data: dropDownDataList
, click: function (unit) {
this.elem[0].childNodes[0].data = unit.title;
obj.tr[0].childNodes[6].childNodes[0].innerText = obj.data.splitInventory[unit.title];
}
, align: 'right' //右对齐弹出(v2.6.8 新增)
, style: 'box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);' //设置额外样式
})
}
//下拉菜单
}
});
// 用于计算盘点结果
calculate = function (obj) {
let oldInventory = Number(obj.tr[0].childNodes[6].childNodes[0].innerText);
let nowInventory = Number(obj.value);
let number = 0;
let takingResult = '';
let takingResultString = '';
let req = {};
if ((oldInventory) > (nowInventory)) {
number = oldInventory - nowInventory;
takingResult = "Inventory_down";
takingResultString = "盘亏";
} else if ((oldInventory) < (nowInventory)) {
number = nowInventory - oldInventory;
takingResult = "Inventory_up";
takingResultString = "盘盈";
} else {
takingResult = "Inventory_normal";
takingResultString = "正常";
}
obj.tr[0].childNodes[8].childNodes[0].innerText = takingResultString;
obj.tr[0].childNodes[9].childNodes[0].innerText = number;
obj.update({takingResult: takingResult});
obj.update({takingInventory: number});
req.number = number + "";
req.takingResult = takingResult;
req.takingResultString = takingResultString;
req.id = obj.data.id + "";
req.unit = obj.tr[0].childNodes[5].childNodes[0].innerText;
req.oldInventory = oldInventory+"";
$.ajax({
url: "/stockTaking/temporaryStorageForTakingResult",
dataType: "json",
data: JSON.stringify(req),
type: "POST",
contentType: "application/json;charset=utf-8"
});
};
});
</script>
</body>
</html>

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

@ -674,6 +674,18 @@
and depositoryId = #{did}
</select>
<select id="findInventoryByMidAndDids" resultMap="InventoryMap" parameterType="map">
select
<include refid="allColumnsAndTypeNameOnViewByInventory" />
from findInventory
where
mid = #{mid}
and depositoryId in
<foreach collection="list" index="index" item="did" open="(" separator="," close=")">
#{did}
</foreach>
</select>
<select id="findMaterialAndTypeById" resultMap="materialAndTypeMap" parameterType="integer">
select
<include refid="allColumnsAndTypeName"/>

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

@ -115,6 +115,45 @@
and pstate != 3
</select>
<select id="findPlaceAndMaterialByDidsAndMid" resultMap="MaterialAndPlaceForViewMap" parameterType="map">
select
<include refid="allColumnsForView"/>
FROM materialandplaceinfo WHERE 1 = 1
<if test="mid != '' and mid != null">
and mid = #{mid}
</if>
and depository_id in
<foreach collection="list" index="index" item="did" open="(" separator="," close=")">
#{did}
</foreach>
and pstate != 3
<if test="begin != null and size != null">
LIMIT #{begin},#{size}
</if>
</select>
<select id="findPlaceAndMaterialForViewById" resultMap="MaterialAndPlaceForViewMap" parameterType="int">
select
<include refid="allColumnsForView"/>
FROM materialandplaceinfo WHERE id = #{id}
</select>
<select id="findPlaceAndMaterialCountByDidsAndMid" resultType="int" parameterType="map">
select
COUNT(*)
FROM materialandplaceinfo WHERE 1 = 1
<if test="mid != '' and mid != null">
and mid = #{mid}
</if>
and depository_id in
<foreach collection="list" index="index" item="did" open="(" separator="," close=")">
#{did}
</foreach>
and pstate != 3
</select>
<select id="findPlaceAndMaterialByCondition" parameterType="map" resultMap="MaterialAndPlaceForViewMap">
select
<include refid="allColumnsForView"/>

14
target/classes/com/dreamchaser/depository_manage/mapper/SplitUnitMapper.xml

@ -103,6 +103,20 @@
</if>
</select>
<select id="findSplitInventoryByIidAndSids" parameterType="map" resultMap="splitInventoryMap">
select
<include refid="splitInventoryAllColumns"/>
from `split_inventory` si
where 1 = 1
<if test="iid != null ">
and si.iid = #{iid}
</if>
and si.sid in
<foreach collection="list" index="index" item="sid" open="(" separator="," close=")">
#{sid}
</foreach>
</select>
<select id="findSplitInventoryBySid" parameterType="int" resultMap="splitInventoryMap">
select
<include refid="splitInventoryAllColumns"/>

250
target/classes/templates/pages/stockTaking/stockTaking.html

@ -57,22 +57,41 @@
lay-filter="form1" id="form1">
<div class="layui-card-body" id="takingHeader" style="padding-right: 0px">
<div class="layui-form-item">
<label class="layui-form-label" style="height: 40px;">盘点位置:</label>
<div class="layui-input-block">
<label class="layui-form-label" style="height: 40px;">物料名称:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input type="text" placeholder="请选择盘点位置" class="layui-input"
<input type="text" placeholder="请选择物料" class="layui-input"
style="border-style: none"
id="openSonByDepository" readonly
id="openSonByMaterial"
onblur="selectMaterialByName(this)"
lay-verify="required"/>
<img src="/static/images/search.ico" height="16" width="16"
id="scanCodeImg"
style="margin-top: 10px" onclick="scanCode(this)">
<i class="layui-icon layui-icon-search"
style="display: inline;"
id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name="depositoryId" class="layui-input"
id="depositoryId"
style="display: none" lay-verify="required"/>
<input type="text" name="placeId" class="layui-input" id="placeId"
<input type="text" name="mid" class="layui-input" id="mid"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="height: 40px;">物料编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="code" name="code" type="text"
placeholder="请填写入物料编码"
value=""
onblur="selectCode(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
id="qrCodeImg"
style="margin-top: 10px"
onclick="scanCodeInStorage(this)">
<input id="qrCode" name="qrCode" type="text"
style="display:none;">
</div>
</div>
</div>
<div class="layui-form-item">
@ -177,7 +196,6 @@
}
// 用于存储当前选择的盘点位置
let depositoryId;
let placeId;
@ -230,54 +248,12 @@
}
});
// 用于打开仓库树形菜单
$('#openSonByDepository').on('click', function () {
layer.open({
type: 2,
title: '弹窗内容',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['70%', '70%'],
move: '.layui-layer-title',
fixed: false,
content: '/selectDepository?type=2',
success: function (layero, index) {
var children = layero.children();
var content = $(children[1]);
var iframeChildren = $(content.children());
content.css('height', '100%');
iframeChildren.css('height', '100%');
},
end: function () {
var nowDepositoryId = $("#depositoryId").val();
var nowPlaceId = $("#placeId").val();
if (nowDepositoryId !== depositoryId || nowPlaceId !== placeId) {
// 如果重新选择盘点位置
var nowDepositoryName = $("#openSonByDepository").val();
$("#form1")[0].reset();
$("#depositoryId").val(nowDepositoryId);
$("#placeId").val(nowPlaceId);
$("#openSonByDepository").val(nowDepositoryName);
form.render();
}
if (nowDepositoryId !== null && nowDepositoryId !== "") {
depositoryId = nowDepositoryId;
placeId = nowPlaceId;
updateTableShow();
}
}
});
});
updateTableShow = function () {
let req = {};
req.depositoryId = depositoryId;
req.placeId = placeId;
req.mid = $("#mid").val();
table.reload('currentTableId', {
url: '/material/findInventoryForStockTaking',
url: '/material/findMaterialByConditionForStockTaking',
page: {
curr: 1
},
@ -287,7 +263,7 @@
table.render({
elem: "#currentTableId",
url: '/material/findInventoryForStockTaking',
url: '/material/findMaterialByConditionForStockTaking',
parseData: function (res) { //res 即为原始返回的数据
return {
"status": res.status, //解析接口状态
@ -313,10 +289,11 @@
height: 'full-255',//固定高度-即固定表头固定第一行首行
cols: [
[
{field: 'mcode', width: 150, title: '存货编码', fixed: 'left'},
{field: 'mcode', width: 100, title: '存货编码', fixed: 'left'},
{field: 'mname', width: 150, title: '物料名称'},
{field: 'typeName', width: 100, title: '物料种类'},
{field: 'version', width: 150, title: '规格型号',},
{field: 'tname', width: 120, title: '物料种类'},
{field: 'dname', width: 150, title: '所处仓库'},
{field: 'pcode', width: 150, title: '所处库位',},
{title: '计量单位', width: 200, templet: '#changeUnit', align: "center"},
{field: 'inventory', width: 100, title: '库存数'},
@ -334,8 +311,8 @@
let takingUnit = j["takingUnit"];
if (takingUnit !== null) {
let parentItem = $("[lay-id='currentTableId'] tr:eq(" + (i + 1) + ")");
let unitHandleItem = parentItem.children()[5];
let quantityHandleItem = parentItem.children()[6];
let unitHandleItem = parentItem.children()[6];
let quantityHandleItem = parentItem.children()[7];
unitHandleItem.childNodes[0].childNodes[1].childNodes[0].data = takingUnit;
quantityHandleItem.childNodes[0].innerText = j["splitInventory"][takingUnit];
}
@ -416,64 +393,6 @@
});
// 扫码盘点位置
scanCode = function () {
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有
success: function (res) {
// 回调
var result = res.resultStr;//当needResult为1时返回处理结果
var req = {};
req.qrCode = result;
req.codeFlag = 2;
$.ajax({
url: "/place/qywxApplicationInScanQrCode",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var data = d.data;
var flag = data["flag"];
if (flag === 0) {
// 如果没有获取到位置
layer.msg("并未查询到对应位置,请重新扫描", {
icon: 0,
time: 1000
}, function () {
depositoryId = -1;
placeId = -1;
});
} else if (flag === 1) {
// 如果获取到的是库位
var place = data["place"];
$("#placeId").val(place.id);
$("#openSonByDepository").val(place.depositoryName);
$("#depositoryId").val(place.did);
depositoryId = place.did;
placeId = place.id;
} else if (flag === 2) {
// 如果获取到的是仓库
var depository = data["depository"];
$("#placeId").val("0");
$("#openSonByDepository").val(depository.dname);
$("#depositoryId").val(depository.id);
depositoryId = depository.id;
placeId = "0";
}
updateTableShow();
}
})
}
})
};
table.on('edit(currentTableFilter)', function (obj) {
obj.update({stockTakingQuantity: obj.value});//修改当前行数据
calculate(obj);
@ -500,7 +419,7 @@
, data: dropDownDataList
, click: function (unit) {
this.elem[0].childNodes[0].data = unit.title;
obj.tr[0].childNodes[6].childNodes[0].innerText = obj.data.splitInventory[unit.title];
obj.tr[0].childNodes[7].childNodes[0].innerText = obj.data.splitInventory[unit.title];
}
, align: 'right' //右对齐弹出(v2.6.8 新增)
, style: 'box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);' //设置额外样式
@ -513,7 +432,7 @@
// 用于计算盘点结果
calculate = function (obj) {
let oldInventory = Number(obj.tr[0].childNodes[6].childNodes[0].innerText);
let oldInventory = Number(obj.tr[0].childNodes[7].childNodes[0].innerText);
let nowInventory = Number(obj.value);
let number = 0;
let takingResult = '';
@ -531,15 +450,15 @@
takingResult = "Inventory_normal";
takingResultString = "正常";
}
obj.tr[0].childNodes[8].childNodes[0].innerText = takingResultString;
obj.tr[0].childNodes[9].childNodes[0].innerText = number;
obj.tr[0].childNodes[9].childNodes[0].innerText = takingResultString;
obj.tr[0].childNodes[10].childNodes[0].innerText = number;
obj.update({takingResult: takingResult});
obj.update({takingInventory: number});
req.number = number + "";
req.takingResult = takingResult;
req.takingResultString = takingResultString;
req.id = obj.data.id + "";
req.unit = obj.tr[0].childNodes[5].childNodes[0].innerText;
req.unit = obj.tr[0].childNodes[6].childNodes[0].innerText;
req.oldInventory = oldInventory+"";
$.ajax({
url: "/stockTaking/temporaryStorageForTakingResult",
@ -549,6 +468,89 @@
contentType: "application/json;charset=utf-8"
});
};
// 用于通过物料名称获取物料
selectMaterialByName = function (obj) {
// 输入code
var data = obj.value;
var req = {};
data = data.split(",")[0];
if(data !== ""){
req.mname = data;
$.ajax({
url: "/material/findMaterialByCondition",
type: "post",
dataType: 'json',
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (d) {
if (d.count > 1) {
layer.msg("请点击右侧搜索确定物品");
$("#openSonByMaterial").val("");
$("#mid").val("");
$("#code").val("");
return false;
} else if (d.count === 0) {
layer.msg("没有该物品,请确认输入是否正确");
$("#openSonByMaterial").val("");
$("#mid").val("");
$("#code").val("");
return false;
} else {
var material = d.data[0];
$("#openSonByMaterial").val(material.mname);
$("#mid").val(material.mid);
$("#code").val(material.code);
form.render();
updateTableShow();
}
}
});
}
};
// 用于实现通过编码查询物料
selectCode = function (obj) {
// 输入code
var code = obj.value;
var req = {};
req.code = code;
req.type = "out";
if(code !== ""){
$.ajax({
url: "/material/findMatrialByCode",
type: "get",
dataType: 'json',
data: (req),
contentType: "application/json;charset=utf-8",
success: function (d) {
var d = d.data;
if (d == null) {
layer.msg("仓库中暂无该物料",{
icon:0,
time:1000
},function () {
$("#openSonByMaterial").val("");
$("#mid").val("");
$("#code").val("");
updateTableShow();
});
} else {
$("#openSonByMaterial").val(d.mname);
$("#mid").val(d.mid);
form.render();
updateTableShow();
}
}
});
}
};
});
</script>

Loading…
Cancel
Save