6 changed files with 321 additions and 2 deletions
-
56src/main/java/com/xujie/modules/base/controller/BaseDictMaintenanceController.java
-
26src/main/java/com/xujie/modules/base/data/BaseDictMaintenanceQuery.java
-
22src/main/java/com/xujie/modules/base/service/BaseDictMaintenanceService.java
-
213src/main/java/com/xujie/modules/base/service/Impl/BaseDictMaintenanceServiceImpl.java
-
4src/main/java/com/xujie/modules/supplierPerformance/service/impl/PerEvaluateRequestServiceImpl.java
-
2src/main/java/com/xujie/modules/sys/service/impl/DictTypeServiceImpl.java
@ -0,0 +1,56 @@ |
|||
package com.xujie.modules.base.controller; |
|||
|
|||
import com.xujie.common.utils.R; |
|||
import com.xujie.modules.base.data.BaseDictMaintenanceQuery; |
|||
import com.xujie.modules.base.service.BaseDictMaintenanceService; |
|||
import com.xujie.modules.sys.entity.DictData; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.web.bind.annotation.PostMapping; |
|||
import org.springframework.web.bind.annotation.RequestBody; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
|
|||
/** |
|||
* 字典维护:主记录(字典类型)只读查询,明细(字典数据)增删改查 |
|||
*/ |
|||
@RestController |
|||
@RequestMapping("/base/dictMaintenance") |
|||
public class BaseDictMaintenanceController { |
|||
|
|||
@Autowired |
|||
private BaseDictMaintenanceService dictMaintenanceService; |
|||
|
|||
@PostMapping("/typeList") |
|||
public R typeList(@RequestBody BaseDictMaintenanceQuery query) { |
|||
return R.ok().put("rows", dictMaintenanceService.listType(query)); |
|||
} |
|||
|
|||
@PostMapping("/dataList") |
|||
public R dataList(@RequestBody BaseDictMaintenanceQuery query) { |
|||
return R.ok().put("rows", dictMaintenanceService.listData(query)); |
|||
} |
|||
|
|||
@PostMapping("/dataSave") |
|||
public R dataSave(@RequestBody DictData dictData) { |
|||
dictMaintenanceService.saveData(dictData); |
|||
return R.ok("保存成功!"); |
|||
} |
|||
|
|||
@PostMapping("/dataUpdate") |
|||
public R dataUpdate(@RequestBody DictData dictData) { |
|||
dictMaintenanceService.updateData(dictData); |
|||
return R.ok("保存成功!"); |
|||
} |
|||
|
|||
@PostMapping("/dataDelete") |
|||
public R dataDelete(@RequestBody DictData dictData) { |
|||
dictMaintenanceService.deleteData(dictData); |
|||
return R.ok("删除成功!"); |
|||
} |
|||
|
|||
@PostMapping("/dataDisable") |
|||
public R dataDisable(@RequestBody DictData dictData) { |
|||
dictMaintenanceService.disableData(dictData); |
|||
return R.ok("操作成功!"); |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
package com.xujie.modules.base.data; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 字典维护(主记录只读 + 明细 CRUD) |
|||
*/ |
|||
@Data |
|||
public class BaseDictMaintenanceQuery { |
|||
|
|||
/** 当前登录工厂 */ |
|||
private String site; |
|||
|
|||
/** 字典类型编码 */ |
|||
private String dictType; |
|||
|
|||
private String dictName; |
|||
|
|||
private String dictLabel; |
|||
|
|||
private String status; |
|||
|
|||
private Integer page = 1; |
|||
|
|||
private Integer limit = 20; |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
package com.xujie.modules.base.service; |
|||
|
|||
import com.xujie.modules.base.data.BaseDictMaintenanceQuery; |
|||
import com.xujie.modules.sys.entity.DictData; |
|||
import com.xujie.modules.sys.entity.DictType; |
|||
|
|||
import java.util.List; |
|||
|
|||
public interface BaseDictMaintenanceService { |
|||
|
|||
List<DictType> listType(BaseDictMaintenanceQuery query); |
|||
|
|||
List<DictData> listData(BaseDictMaintenanceQuery query); |
|||
|
|||
void saveData(DictData dictData); |
|||
|
|||
void updateData(DictData dictData); |
|||
|
|||
void deleteData(DictData dictData); |
|||
|
|||
void disableData(DictData dictData); |
|||
} |
|||
@ -0,0 +1,213 @@ |
|||
package com.xujie.modules.base.service.Impl; |
|||
|
|||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|||
import com.xujie.modules.base.data.BaseDictMaintenanceQuery; |
|||
import com.xujie.modules.base.service.BaseDictMaintenanceService; |
|||
import com.xujie.modules.sys.entity.DictData; |
|||
import com.xujie.modules.sys.entity.DictType; |
|||
import com.xujie.modules.sys.service.DictDataService; |
|||
import com.xujie.modules.sys.service.DictTypeService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.util.StringUtils; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.Comparator; |
|||
import java.util.LinkedHashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.Objects; |
|||
|
|||
@Service |
|||
public class BaseDictMaintenanceServiceImpl implements BaseDictMaintenanceService { |
|||
|
|||
private static final String ALL_SITE = "*"; |
|||
|
|||
@Autowired |
|||
private DictTypeService dictTypeService; |
|||
|
|||
@Autowired |
|||
private DictDataService dictDataService; |
|||
|
|||
@Override |
|||
public List<DictType> listType(BaseDictMaintenanceQuery query) { |
|||
String userSite = requireSite(query.getSite()); |
|||
List<DictType> merged = new ArrayList<>(); |
|||
merged.addAll(queryType(userSite, query)); |
|||
merged.addAll(queryType(ALL_SITE, query)); |
|||
Map<String, DictType> map = new LinkedHashMap<>(); |
|||
for (DictType row : merged) { |
|||
if (row == null || !StringUtils.hasText(row.getDictType())) { |
|||
continue; |
|||
} |
|||
DictType existing = map.get(row.getDictType()); |
|||
if (existing == null || ALL_SITE.equals(row.getSite())) { |
|||
map.put(row.getDictType(), row); |
|||
} |
|||
} |
|||
return new ArrayList<>(map.values()); |
|||
} |
|||
|
|||
@Override |
|||
public List<DictData> listData(BaseDictMaintenanceQuery query) { |
|||
if (!StringUtils.hasText(query.getDictType())) { |
|||
throw new RuntimeException("字典类型为空"); |
|||
} |
|||
String userSite = requireSite(query.getSite()); |
|||
List<DictData> rows = new ArrayList<>(); |
|||
rows.addAll(queryData(ALL_SITE, query)); |
|||
if (!ALL_SITE.equals(userSite)) { |
|||
rows.addAll(queryData(userSite, query)); |
|||
} |
|||
rows.sort(Comparator.comparingInt(r -> r.getDictSort() == null ? 0 : r.getDictSort())); |
|||
return rows; |
|||
} |
|||
|
|||
@Override |
|||
public void saveData(DictData dictData) { |
|||
assertData(dictData, false); |
|||
assertDefaultUnique(dictData, null); |
|||
assertValueUnique(dictData, null); |
|||
if (!dictDataService.save(dictData)) { |
|||
throw new RuntimeException("保存失败"); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void updateData(DictData dictData) { |
|||
assertData(dictData, true); |
|||
assertDefaultUnique(dictData, dictData.getDictCode()); |
|||
assertValueUnique(dictData, dictData.getDictCode()); |
|||
if (!dictDataService.updateById(dictData)) { |
|||
throw new RuntimeException("保存失败"); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void deleteData(DictData dictData) { |
|||
if (Objects.isNull(dictData) || Objects.isNull(dictData.getDictCode())) { |
|||
throw new RuntimeException("字典数据为空"); |
|||
} |
|||
DictData existing = dictDataService.getById(dictData.getDictCode()); |
|||
assertExistingData(existing); |
|||
if ("Y".equals(existing.getIsSystem())) { |
|||
throw new RuntimeException("系统字典不可删除"); |
|||
} |
|||
if (!dictDataService.removeById(dictData.getDictCode())) { |
|||
throw new RuntimeException("删除失败"); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void disableData(DictData dictData) { |
|||
if (Objects.isNull(dictData) || Objects.isNull(dictData.getDictCode())) { |
|||
throw new RuntimeException("字典数据为空"); |
|||
} |
|||
DictData existing = dictDataService.getById(dictData.getDictCode()); |
|||
assertExistingData(existing); |
|||
if ("Y".equals(existing.getIsSystem())) { |
|||
throw new RuntimeException("系统字典不可停用"); |
|||
} |
|||
if (!dictDataService.lambdaUpdate() |
|||
.set(DictData::getStatus, "N") |
|||
.eq(DictData::getDictCode, dictData.getDictCode()) |
|||
.update()) { |
|||
throw new RuntimeException("操作失败"); |
|||
} |
|||
} |
|||
|
|||
private List<DictType> queryType(String site, BaseDictMaintenanceQuery query) { |
|||
LambdaQueryWrapper<DictType> wrapper = new LambdaQueryWrapper<>(); |
|||
wrapper.eq(DictType::getSite, site); |
|||
if (StringUtils.hasText(query.getDictType())) { |
|||
wrapper.like(DictType::getDictType, query.getDictType()); |
|||
} |
|||
if (StringUtils.hasText(query.getDictName())) { |
|||
wrapper.like(DictType::getDictName, query.getDictName()); |
|||
} |
|||
if (StringUtils.hasText(query.getStatus())) { |
|||
wrapper.eq(DictType::getStatus, query.getStatus()); |
|||
} |
|||
wrapper.orderByAsc(DictType::getDictType); |
|||
return dictTypeService.list(wrapper); |
|||
} |
|||
|
|||
private List<DictData> queryData(String site, BaseDictMaintenanceQuery query) { |
|||
LambdaQueryWrapper<DictData> wrapper = new LambdaQueryWrapper<>(); |
|||
wrapper.eq(DictData::getSite, site); |
|||
wrapper.eq(DictData::getDictType, query.getDictType()); |
|||
if (StringUtils.hasText(query.getDictLabel())) { |
|||
wrapper.like(DictData::getDictLabel, query.getDictLabel()); |
|||
} |
|||
if (StringUtils.hasText(query.getStatus())) { |
|||
wrapper.eq(DictData::getStatus, query.getStatus()); |
|||
} |
|||
wrapper.orderByAsc(DictData::getDictSort); |
|||
return dictDataService.list(wrapper); |
|||
} |
|||
|
|||
private String requireSite(String site) { |
|||
if (!StringUtils.hasText(site)) { |
|||
throw new RuntimeException("工厂编码为空"); |
|||
} |
|||
return site.trim(); |
|||
} |
|||
|
|||
private void assertData(DictData dictData, boolean update) { |
|||
if (Objects.isNull(dictData)) { |
|||
throw new RuntimeException("字典数据为空"); |
|||
} |
|||
if (update && Objects.isNull(dictData.getDictCode())) { |
|||
throw new RuntimeException("字典编码为空"); |
|||
} |
|||
if (!StringUtils.hasText(dictData.getDictType())) { |
|||
throw new RuntimeException("字典类型为空"); |
|||
} |
|||
if (!StringUtils.hasText(dictData.getDictValue())) { |
|||
throw new RuntimeException("字典键值为空"); |
|||
} |
|||
if (!StringUtils.hasText(dictData.getSite())) { |
|||
throw new RuntimeException("工厂编码为空"); |
|||
} |
|||
} |
|||
|
|||
private void assertExistingData(DictData existing) { |
|||
if (existing == null) { |
|||
throw new RuntimeException("字典数据不存在"); |
|||
} |
|||
} |
|||
|
|||
private void assertDefaultUnique(DictData dictData, Long excludeCode) { |
|||
if (!"Y".equals(dictData.getIsDefault())) { |
|||
return; |
|||
} |
|||
LambdaQueryWrapper<DictData> wrapper = new LambdaQueryWrapper<DictData>() |
|||
.eq(DictData::getDictType, dictData.getDictType()) |
|||
.eq(DictData::getSite, dictData.getSite()) |
|||
.eq(DictData::getIsDefault, "Y"); |
|||
List<DictData> list = dictDataService.list(wrapper); |
|||
if (list == null || list.isEmpty()) { |
|||
return; |
|||
} |
|||
if (excludeCode == null || list.stream().anyMatch(item -> !excludeCode.equals(item.getDictCode()))) { |
|||
throw new RuntimeException("当前字典已存在默认值"); |
|||
} |
|||
} |
|||
|
|||
private void assertValueUnique(DictData dictData, Long excludeCode) { |
|||
LambdaQueryWrapper<DictData> wrapper = new LambdaQueryWrapper<DictData>() |
|||
.eq(DictData::getDictType, dictData.getDictType()) |
|||
.eq(DictData::getSite, dictData.getSite()) |
|||
.eq(DictData::getDictValue, dictData.getDictValue()); |
|||
List<DictData> list = dictDataService.list(wrapper); |
|||
if (list == null || list.isEmpty()) { |
|||
return; |
|||
} |
|||
if (excludeCode == null) { |
|||
throw new RuntimeException("字典键值重复"); |
|||
} |
|||
if (list.size() > 1 || !excludeCode.equals(list.get(0).getDictCode())) { |
|||
throw new RuntimeException("字典键值重复"); |
|||
} |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue