zhanghl
2025-05-21 7ad059d1e35f88843852ef3c9278658834ab54ab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
package com.aps.core.service.impl;
 
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.aps.common.core.utils.DateUtils;
import com.aps.common.core.utils.StringUtils;
import com.aps.core.domain.ApsMaterialStorageManagement;
import com.aps.core.mapper.ApsMaterialStorageManagementMapper;
import com.aps.core.service.IApsMaterialStorageManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
 
import java.math.BigDecimal;
import java.util.*;
 
/**
 * 物料库存管理Service业务层处理
 * 
 * @author dingYang
 * @date 2025-04-17
 */
@Service
public class ApsMaterialStorageManagementServiceImpl implements IApsMaterialStorageManagementService 
{
    @Autowired
    private ApsMaterialStorageManagementMapper apsMaterialStorageManagementMapper;
    @Autowired
    public RedisTemplate redisTemplate;
    /**
     * 查询物料库存管理
     * 
     * @param id 物料库存管理主键
     * @return 物料库存管理
     */
    @Override
    public ApsMaterialStorageManagement selectApsMaterialStorageManagementById(String id)
    {
        return apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementById(id);
    }
 
    /**
     * 查询物料库存管理列表
     * 
     * @param apsMaterialStorageManagement 物料库存管理
     * @return 物料库存管理
     */
    @Override
    public List<ApsMaterialStorageManagement> selectApsMaterialStorageManagementList(ApsMaterialStorageManagement apsMaterialStorageManagement)
    {
        return apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementList(apsMaterialStorageManagement);
    }
 
    /**
     * 新增物料库存管理
     * 
     * @param apsMaterialStorageManagement 物料库存管理
     * @return 结果
     */
    @Override
    public int insertApsMaterialStorageManagement(ApsMaterialStorageManagement apsMaterialStorageManagement)
    {
        apsMaterialStorageManagement.setCreateTime(DateUtils.getNowDate());
        return apsMaterialStorageManagementMapper.insertApsMaterialStorageManagement(apsMaterialStorageManagement);
    }
 
    /**
     * 修改物料库存管理
     * 
     * @param apsMaterialStorageManagement 物料库存管理
     * @return 结果
     */
    @Override
    public int updateApsMaterialStorageManagement(ApsMaterialStorageManagement apsMaterialStorageManagement)
    {
        apsMaterialStorageManagement.setUpdateTime(DateUtils.getNowDate());
        return apsMaterialStorageManagementMapper.updateApsMaterialStorageManagement(apsMaterialStorageManagement);
    }
 
    /**
     * 批量删除物料库存管理
     * 
     * @param ids 需要删除的物料库存管理主键
     * @return 结果
     */
    @Override
    public int deleteApsMaterialStorageManagementByIds(String[] ids)
    {
        return apsMaterialStorageManagementMapper.deleteApsMaterialStorageManagementByIds(ids);
    }
 
    /**
     * 删除物料库存管理信息
     * 
     * @param id 物料库存管理主键
     * @return 结果
     */
    @Override
    public int deleteApsMaterialStorageManagementById(String id)
    {
        return apsMaterialStorageManagementMapper.deleteApsMaterialStorageManagementById(id);
    }
    /**
     * 获取物料库存信息
     * */
    @Override
    public Optional<ApsMaterialStorageManagement> getItemStorage(String plant, String itemNumber) {
        ApsMaterialStorageManagement storageParam = new ApsMaterialStorageManagement();
        storageParam.setItemNumber(itemNumber);
        storageParam.setApplicableFactories(plant);
        return apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementList(storageParam).stream()
                .findFirst();
    }
 
    /**
     * 从Redis中获取库存信息
     *
     * 此方法首先尝试从Redis中获取指定工厂和物料代码的库存信息如果Redis中不存在相关数据,
     * 则从数据库中查询,并将结果缓存到Redis中以提高下次查询的效率
     *
     * @param plant 工厂代码,用于指定库存信息所属的工厂
     * @param itemCode 物料代码,用于指定需要查询的物料
     * @return ApsMaterialStorageManagement 返回获取到的库存信息对象,如果没有找到,则返回null
     */
    @Override
    public Optional<ApsMaterialStorageManagement> getRdsStorage(String plant, String itemCode){
        // 尝试从Redis中获取库存信息
        String key = "MaterialStorage:Material_" + plant + "_" + itemCode;
        JSONObject materialStorage = (JSONObject)redisTemplate.opsForValue().get(key);
        if(materialStorage!=null){
            // 如果Redis中有缓存,将其转换为ApsMaterialStorageManagement对象并返回
            ApsMaterialStorageManagement ams= materialStorage.toJavaObject(ApsMaterialStorageManagement.class);
            Optional<ApsMaterialStorageManagement>   optional =  Optional.ofNullable(ams);
            return optional  ;
        }else {
            // 从数据库中查询库存信息
            Optional<ApsMaterialStorageManagement> first = getItemStorage( plant, itemCode);
            first.ifPresent(apsMaterialStorageManagement ->
                    redisTemplate.opsForValue().set(key, JSONObject.parseObject(JSON.toJSONString(apsMaterialStorageManagement)))
            );
            return first;
        }
    }
 
    /**
     * 设置库存数据到redis
     * @param orgCode
     * @return
     */
    @Override
    public boolean setStorageDataToRedis(String orgCode) {
        try {
            Set<String> keys = redisTemplate.keys("MaterialStorage:Material_*");
            if (keys != null && !keys.isEmpty()) {
                redisTemplate.delete(keys);
            }
            ApsMaterialStorageManagement temp = new ApsMaterialStorageManagement();
            if(!StringUtils.isEmpty(orgCode)){
                temp.setApplicableFactories(orgCode);
            }
            List<ApsMaterialStorageManagement> list = apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementList(temp);
            Map<String, Object> bulkData = new HashMap<>();
            list.forEach(apsMaterialStorageManagement -> {
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("id", apsMaterialStorageManagement.getId());
                jsonObject.put("itemNumber", apsMaterialStorageManagement.getItemNumber());
                jsonObject.put("remainderStock", apsMaterialStorageManagement.getRemainderStock());
                jsonObject.put("applicableFactories", apsMaterialStorageManagement.getApplicableFactories());
                bulkData.put("MaterialStorage:Material_"+apsMaterialStorageManagement.getApplicableFactories()+"_"+apsMaterialStorageManagement.getItemNumber(), jsonObject);
            });
            redisTemplate.opsForValue().multiSet(bulkData);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
//        Set<String> keys = redisTemplate.keys("MaterialStorage:Material_*");
//        if (keys != null && !keys.isEmpty()) {
//            redisTemplate.delete(keys);
//        }
        return true;
    }
 
    /**
     * 更新库存信息
     * */
    public int updateMaterialStorageByVersion(String id, BigDecimal remainderStock, Integer version) {
        return apsMaterialStorageManagementMapper.updateMaterialStorageByVersion(id, remainderStock, version);
    }
 
    @Override
    public int  updateRemainderStock(String id, BigDecimal remainderStock, Integer version){
        return apsMaterialStorageManagementMapper.updateRemainderStock(id, remainderStock, version);
    }
}