diff --git a/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFeedListController.java b/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFeedListController.java new file mode 100644 index 0000000..446327d --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFeedListController.java @@ -0,0 +1,236 @@ +package com.zhyc.module.feed.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; + +import com.zhyc.module.feed.domain.SgFeedPlan; +import com.zhyc.module.feed.domain.SgFormulaManagement; +import com.zhyc.module.feed.service.ISgFeedPlanService; +import com.zhyc.module.feed.service.ISgFormulaManagementService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhyc.common.annotation.Log; +import com.zhyc.common.core.controller.BaseController; +import com.zhyc.common.core.domain.AjaxResult; +import com.zhyc.common.enums.BusinessType; +import com.zhyc.module.feed.domain.SgFeedList; +import com.zhyc.module.feed.service.ISgFeedListService; +import com.zhyc.common.utils.poi.ExcelUtil; +import com.zhyc.common.core.page.TableDataInfo; + +/** + * 配料清单Controller + * + * @author HashMap + * @date 2025-08-19 + */ +@RestController +@RequestMapping("/feed/FeedList") +public class SgFeedListController extends BaseController { + private final ISgFeedListService sgFeedListService; + + private final ISgFormulaManagementService sgFormulaManagementService; + + private final ISgFeedPlanService sgFeedPlanService; + + private final Map sgFeedListMap = new HashMap<>(); + + public static boolean refresh = true; + + @Autowired + public SgFeedListController(ISgFeedListService sgFeedListService, ISgFormulaManagementService sgFormulaManagementService, ISgFeedPlanService sgFeedPlanService) { + this.sgFeedListService = sgFeedListService; + this.sgFormulaManagementService = sgFormulaManagementService; + this.sgFeedPlanService = sgFeedPlanService; + } + + /** + * 查询配料清单列表 + */ + @PreAuthorize("@ss.hasPermi('feed:FeedList:list')") + @GetMapping("/list") + @Transactional(rollbackFor = Exception.class) + public TableDataInfo list(SgFeedList sgFeedList) { + /* + 刷新缓存 + 当配方管理表出现更新 或 饲喂计划表出现增删改时会将refresh置为true 通知此处进行刷新 + */ + if (refresh) { + SyncFeedList(); + refresh = false; + } + startPage(); + List list = sgFeedListService.selectSgFeedListList(sgFeedList); + // 用 map 中已有的数据替换 list 中的元素 + List replacedList = new ArrayList<>(); + for (SgFeedList item : list) { + String key = item.getFormulaId() + "_" + item.getFormulaBatchId(); + // 从缓存中取出完整对象 + SgFeedList itemInCache = sgFeedListMap.getOrDefault(key, item); + // 将数据库查询的基本信息替换掉缓存中去除的内容 - 前端展示与修改需要 + itemInCache.setId(item.getId()); + itemInCache.setFormulaBatchId(item.getFormulaBatchId()); + itemInCache.setFormulaId(item.getFormulaId()); + itemInCache.setZookeeper(item.getZookeeper()); + itemInCache.setDeployDate(item.getDeployDate()); + // 替换为 map 中的对象 + replacedList.add(itemInCache); + } + return getDataTable(replacedList); + } + + /** + * 导出配料清单列表 + */ + @PreAuthorize("@ss.hasPermi('feed:FeedList:export')") + @Log(title = "配料清单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SgFeedList sgFeedList) { + List list = sgFeedListService.selectSgFeedListList(sgFeedList); + ExcelUtil util = new ExcelUtil<>(SgFeedList.class); + util.exportExcel(response, list, "配料清单数据"); + } + + /** + * 获取配料清单详细信息 + */ + @PreAuthorize("@ss.hasPermi('feed:FeedList:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return success(sgFeedListService.selectSgFeedListById(id)); + } + + /** + * 新增配料清单 + */ + @PreAuthorize("@ss.hasPermi('feed:FeedList:add')") + @Log(title = "配料清单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SgFeedList sgFeedList) { + return toAjax(sgFeedListService.insertSgFeedList(sgFeedList)); + } + + /** + * 修改配料清单 + */ + @PreAuthorize("@ss.hasPermi('feed:FeedList:edit')") + @Log(title = "配料清单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SgFeedList sgFeedList) { + return toAjax(sgFeedListService.updateSgFeedList(sgFeedList)); + } + + /** + * 删除配料清单 + */ + @PreAuthorize("@ss.hasPermi('feed:FeedList:remove')") + @Log(title = "配料清单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + @Transactional(rollbackFor = Exception.class) + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(sgFeedListService.deleteSgFeedListByIds(ids)); + } + + + public void SyncFeedList() { + // 清空旧缓存 + sgFeedListMap.clear(); + // 获取配方管理和现有配料清单内容 + List formulaManagementList = sgFormulaManagementService.selectSgFormulaManagementList(new SgFormulaManagement()); + List feedLists = sgFeedListService.selectSgFeedListList(new SgFeedList()); + // 将最新查询的配料清单加入缓存 + for (SgFeedList sgFeedList : feedLists) { + sgFeedListMap.put(sgFeedList.getFormulaId() + "_" + sgFeedList.getFormulaBatchId(), sgFeedList); + } + // 与新的配方管理列表同步 - 如果配料清单没有对应数据则加入 + for (SgFormulaManagement sgFormulaManagement : formulaManagementList) { + // 匹配 但忽略模板配方 + if (sgFormulaManagement.getFormulaId() != null && sgFormulaManagement.getBatchId() != null && !sgFormulaManagement.getBatchId().equals("0")) { + // 查询当前配方管理项是否存在现有配料计划中 (不论是否存在都要设置,因为缓存被清空,存在则更新,不存在则插入) + boolean isExist = sgFeedListMap.containsKey(sgFormulaManagement.getFormulaId() + "_" + sgFormulaManagement.getBatchId()); + // 标志位 : 如果当前配方不在饲喂计划中则不生成配量清单 + boolean isPlan = true; + // 设置缓存对象具体值 + SgFeedList sgFeedList = new SgFeedList(); + sgFeedList.setFormulaId(sgFormulaManagement.getFormulaId()); + sgFeedList.setFormulaBatchId(sgFormulaManagement.getBatchId()); + sgFeedList.setFormulaList(sgFormulaManagement.getSgFormulaList()); + sgFeedList.setRootFormula(sgFormulaManagement); + + + // 从饲喂计划列表中查出对应值(饲喂量需要计划中的比例计算) + SgFeedPlan rootPlanQuery = new SgFeedPlan(); + rootPlanQuery.setFormulaId(sgFormulaManagement.getFormulaId()); + rootPlanQuery.setBatchId(sgFormulaManagement.getBatchId()); + List sgFeedPlans = sgFeedPlanService.selectSgFeedPlanList(rootPlanQuery); + // 为空则标识当前配方不在饲喂计划中 && 不在缓存中设置 + if (sgFeedPlans.isEmpty()) { + isPlan = false; + } else { + // rootPlan中存储的是该配方批号的总量 + SgFeedPlan rootPlan = computePlanTotal(sgFeedPlans); + + // 将计划实体对象设置到配料清单中 + sgFeedList.setRootPlan(rootPlan); + + // 完整的配料清单对象加入缓存 + sgFeedListMap.put(sgFormulaManagement.getFormulaId() + "_" + sgFormulaManagement.getBatchId(), sgFeedList); + } + + // 不存在则插入 + if (!isExist && isPlan) { + sgFeedListService.insertSgFeedList(sgFeedList); + } + } + } + } + + /** + * 计算某个配方某个批次的总和值 + * + * @param sgFeedPlans 配方计划列表 + * @return 各个值总和 + */ + private static SgFeedPlan computePlanTotal(List sgFeedPlans) { + SgFeedPlan rootPlan = new SgFeedPlan(); + if (!sgFeedPlans.isEmpty()) { + int sheepCountTotal = 0; + double sheepDailySize = 0.0; + double planFeedMorningSize = 0.0; + double planFeedNoonSize = 0.0; + double planFeedAfternoonSize = 0.0; + double planFeedTotalSize = 0.0; + for (SgFeedPlan sgFeedPlan : sgFeedPlans) { + sheepCountTotal += sgFeedPlan.getSheepCount(); + sheepDailySize += sgFeedPlan.getPlanDailySize(); + planFeedMorningSize += sgFeedPlan.getPlanMorningSize(); + planFeedNoonSize += sgFeedPlan.getPlanNoonSize(); + planFeedAfternoonSize += sgFeedPlan.getPlanAfternoonSize(); + planFeedTotalSize += sgFeedPlan.getPlanFeedTotal(); + } + + rootPlan.setSheepCount(sheepCountTotal); + rootPlan.setPlanDailySize(sheepDailySize); + rootPlan.setPlanMorningSize(planFeedMorningSize); + rootPlan.setPlanNoonSize(planFeedNoonSize); + rootPlan.setPlanAfternoonSize(planFeedAfternoonSize); + rootPlan.setPlanFeedTotal(planFeedTotalSize); + + // 设置计划日期 + rootPlan.setPlanDate(sgFeedPlans.get(0).getPlanDate()); + } + return rootPlan; + } +} diff --git a/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFeedPlanController.java b/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFeedPlanController.java index 4661361..39bde43 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFeedPlanController.java +++ b/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFeedPlanController.java @@ -82,6 +82,8 @@ public class SgFeedPlanController extends BaseController { sgFeedPlan.setCreateDate(new Date()); // 计算其他字段值 setPlan(sgFeedPlan); + // 通知配料清单刷新数据 + SgFeedListController.refresh = true; return toAjax(sgFeedPlanService.insertSgFeedPlan(sgFeedPlan)); } @@ -94,6 +96,8 @@ public class SgFeedPlanController extends BaseController { public AjaxResult edit(@RequestBody SgFeedPlan sgFeedPlan) { // 根据修改后的值重新计算 setPlan(sgFeedPlan); + // 通知配料清单刷新数据 + SgFeedListController.refresh = true; return toAjax(sgFeedPlanService.updateSgFeedPlan(sgFeedPlan)); } @@ -104,6 +108,8 @@ public class SgFeedPlanController extends BaseController { @Log(title = "饲喂计划", businessType = BusinessType.DELETE) @DeleteMapping("/{createDates}") public AjaxResult remove(@PathVariable Date[] createDates) { + // 通知配料清单刷新数据 + SgFeedListController.refresh = true; return toAjax(sgFeedPlanService.deleteSgFeedPlanByCreateDates(createDates)); } @@ -111,7 +117,7 @@ public class SgFeedPlanController extends BaseController { * 设定计划值 * 用于添加和修改 */ - private SgFeedPlan setPlan(SgFeedPlan sgFeedPlan) { + private void setPlan(SgFeedPlan sgFeedPlan) { // 根据羊舍ID获取羊只数量 int countByFoldId = sgFeedPlanService.getSheepCountByFoldId(sgFeedPlan.getSheepHouseId()); sgFeedPlan.setSheepCount(countByFoldId); @@ -121,6 +127,5 @@ public class SgFeedPlanController extends BaseController { sgFeedPlan.setPlanMorningSize(sgFeedPlan.getPlanFeedTotal() * (sgFeedPlan.getRatioMorning() / 100)); sgFeedPlan.setPlanNoonSize(sgFeedPlan.getPlanFeedTotal() * (sgFeedPlan.getRatioNoon() / 100)); sgFeedPlan.setPlanAfternoonSize(sgFeedPlan.getPlanFeedTotal() * (sgFeedPlan.getRatioAfternoon() / 100)); - return sgFeedPlan; } } diff --git a/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFormulaManagementController.java b/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFormulaManagementController.java index 3f33ae2..9284c7a 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFormulaManagementController.java +++ b/zhyc-module/src/main/java/com/zhyc/module/feed/controller/SgFormulaManagementController.java @@ -143,6 +143,9 @@ public class SgFormulaManagementController extends BaseController { sgFormulaListItem.setFormulaId(sgFormulaManagement.getFormulaId()); sgFormulaListService.insertSgFormulaList(sgFormulaListItem); } + + // 通知配料清单刷新数据 + SgFeedListController.refresh = true; return toAjax(sgFormulaManagementService.updateSgFormulaManagement(sgFormulaManagement)); } @@ -167,6 +170,9 @@ public class SgFormulaManagementController extends BaseController { } // 前置检查完毕 执行删除 sgFormulaManagement.setBatchId(batchId); + + // 通知配料清单刷新数据 + SgFeedListController.refresh = true; return toAjax(sgFormulaManagementService.deleteSgFormulaManagement(sgFormulaManagement)); } } diff --git a/zhyc-module/src/main/java/com/zhyc/module/feed/domain/SgFeedList.java b/zhyc-module/src/main/java/com/zhyc/module/feed/domain/SgFeedList.java new file mode 100644 index 0000000..0b3c61b --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/feed/domain/SgFeedList.java @@ -0,0 +1,67 @@ +package com.zhyc.module.feed.domain; + +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.zhyc.common.annotation.Excel; +import com.zhyc.common.core.domain.BaseEntity; + +/** + * 配料清单对象 sg_feed_list + * + * @author HashMap + * @date 2025-08-19 + */ +@Setter +@Getter +public class SgFeedList extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 序号 */ + private Long id; + + /** 配方编号 */ + @Excel(name = "配方编号") + private String formulaId; + + /** 配方批号 */ + @Excel(name = "配方批号") + private String formulaBatchId; + + /** 饲草班人员 */ + @Excel(name = "饲草班人员") + private String zookeeper; + + /** 配料日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "配料日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date deployDate; + + private SgFormulaManagement rootFormula; + + private SgFeedPlan rootPlan; + + private Double morningTotal; + private Double noonTotal; + private Double afternoonTotal; + + private List formulaList; + + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("formulaId", getFormulaId()) + .append("formulaBatchId", getFormulaBatchId()) + .append("zookeeper", getZookeeper()) + .append("deployDate", getDeployDate()) + .toString(); + } +} diff --git a/zhyc-module/src/main/java/com/zhyc/module/feed/mapper/SgFeedListMapper.java b/zhyc-module/src/main/java/com/zhyc/module/feed/mapper/SgFeedListMapper.java new file mode 100644 index 0000000..47e837c --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/feed/mapper/SgFeedListMapper.java @@ -0,0 +1,63 @@ +package com.zhyc.module.feed.mapper; + +import java.util.List; +import com.zhyc.module.feed.domain.SgFeedList; +import org.apache.ibatis.annotations.Mapper; + +/** + * 配料清单Mapper接口 + * + * @author HashMap + * @date 2025-08-19 + */ +@Mapper +public interface SgFeedListMapper +{ + /** + * 查询配料清单 + * + * @param id 配料清单主键 + * @return 配料清单 + */ + SgFeedList selectSgFeedListById(Long id); + + /** + * 查询配料清单列表 + * + * @param sgFeedList 配料清单 + * @return 配料清单集合 + */ + List selectSgFeedListList(SgFeedList sgFeedList); + + /** + * 新增配料清单 + * + * @param sgFeedList 配料清单 + * @return 结果 + */ + int insertSgFeedList(SgFeedList sgFeedList); + + /** + * 修改配料清单 + * + * @param sgFeedList 配料清单 + * @return 结果 + */ + int updateSgFeedList(SgFeedList sgFeedList); + + /** + * 删除配料清单 + * + * @param id 配料清单主键 + * @return 结果 + */ + int deleteSgFeedListById(Long id); + + /** + * 批量删除配料清单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + int deleteSgFeedListByIds(Long[] ids); +} diff --git a/zhyc-module/src/main/java/com/zhyc/module/feed/service/ISgFeedListService.java b/zhyc-module/src/main/java/com/zhyc/module/feed/service/ISgFeedListService.java new file mode 100644 index 0000000..b293d84 --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/feed/service/ISgFeedListService.java @@ -0,0 +1,61 @@ +package com.zhyc.module.feed.service; + +import java.util.List; +import com.zhyc.module.feed.domain.SgFeedList; + +/** + * 配料清单Service接口 + * + * @author HashMap + * @date 2025-08-19 + */ +public interface ISgFeedListService +{ + /** + * 查询配料清单 + * + * @param id 配料清单主键 + * @return 配料清单 + */ + SgFeedList selectSgFeedListById(Long id); + + /** + * 查询配料清单列表 + * + * @param sgFeedList 配料清单 + * @return 配料清单集合 + */ + List selectSgFeedListList(SgFeedList sgFeedList); + + /** + * 新增配料清单 + * + * @param sgFeedList 配料清单 + * @return 结果 + */ + int insertSgFeedList(SgFeedList sgFeedList); + + /** + * 修改配料清单 + * + * @param sgFeedList 配料清单 + * @return 结果 + */ + int updateSgFeedList(SgFeedList sgFeedList); + + /** + * 批量删除配料清单 + * + * @param ids 需要删除的配料清单主键集合 + * @return 结果 + */ + int deleteSgFeedListByIds(Long[] ids); + + /** + * 删除配料清单信息 + * + * @param id 配料清单主键 + * @return 结果 + */ + int deleteSgFeedListById(Long id); +} diff --git a/zhyc-module/src/main/java/com/zhyc/module/feed/service/impl/SgFeedListServiceImpl.java b/zhyc-module/src/main/java/com/zhyc/module/feed/service/impl/SgFeedListServiceImpl.java new file mode 100644 index 0000000..704d45d --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/feed/service/impl/SgFeedListServiceImpl.java @@ -0,0 +1,96 @@ +package com.zhyc.module.feed.service.impl; + +import java.util.List; + +import org.springframework.stereotype.Service; +import com.zhyc.module.feed.mapper.SgFeedListMapper; +import com.zhyc.module.feed.domain.SgFeedList; +import com.zhyc.module.feed.service.ISgFeedListService; + +/** + * 配料清单Service业务层处理 + * + * @author HashMap + * @date 2025-08-19 + */ +@Service +public class SgFeedListServiceImpl implements ISgFeedListService +{ + private final SgFeedListMapper sgFeedListMapper; + + public SgFeedListServiceImpl(SgFeedListMapper sgFeedListMapper) { + this.sgFeedListMapper = sgFeedListMapper; + } + + /** + * 查询配料清单 + * + * @param id 配料清单主键 + * @return 配料清单 + */ + @Override + public SgFeedList selectSgFeedListById(Long id) + { + return sgFeedListMapper.selectSgFeedListById(id); + } + + /** + * 查询配料清单列表 + * + * @param sgFeedList 配料清单 + * @return 配料清单 + */ + @Override + public List selectSgFeedListList(SgFeedList sgFeedList) + { + return sgFeedListMapper.selectSgFeedListList(sgFeedList); + } + + /** + * 新增配料清单 + * + * @param sgFeedList 配料清单 + * @return 结果 + */ + @Override + public int insertSgFeedList(SgFeedList sgFeedList) + { + return sgFeedListMapper.insertSgFeedList(sgFeedList); + } + + /** + * 修改配料清单 + * + * @param sgFeedList 配料清单 + * @return 结果 + */ + @Override + public int updateSgFeedList(SgFeedList sgFeedList) + { + return sgFeedListMapper.updateSgFeedList(sgFeedList); + } + + /** + * 批量删除配料清单 + * + * @param ids 需要删除的配料清单主键 + * @return 结果 + */ + @Override + public int deleteSgFeedListByIds(Long[] ids) + { + return sgFeedListMapper.deleteSgFeedListByIds(ids); + } + + /** + * 删除配料清单信息 + * + * @param id 配料清单主键 + * @return 结果 + */ + @Override + public int deleteSgFeedListById(Long id) + { + return sgFeedListMapper.deleteSgFeedListById(id); + } +} diff --git a/zhyc-module/src/main/resources/mapper/feed/SgFeedListMapper.xml b/zhyc-module/src/main/resources/mapper/feed/SgFeedListMapper.xml new file mode 100644 index 0000000..25e0143 --- /dev/null +++ b/zhyc-module/src/main/resources/mapper/feed/SgFeedListMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + select id, formula_id, formula_batch_id, zookeeper, deploy_date from sg_feed_list + + + + + + + + insert into sg_feed_list + + formula_id, + formula_batch_id, + zookeeper, + deploy_date, + + + #{formulaId}, + #{formulaBatchId}, + #{zookeeper}, + #{deployDate}, + + + + + update sg_feed_list + + formula_id = #{formulaId}, + formula_batch_id = #{formulaBatchId}, + zookeeper = #{zookeeper}, + deploy_date = #{deployDate}, + + where id = #{id} + + + + delete from sg_feed_list where id = #{id} + + + + delete from sg_feed_list where id in + + #{id} + + + \ No newline at end of file