فهرست منبع

pms 运营会议

zhangcl 5 روز پیش
والد
کامیت
6f0e79f721
19فایلهای تغییر یافته به همراه1592 افزوده شده و 0 حذف شده
  1. 2 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java
  2. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/config/PmsDataPermissionConfiguration.java
  3. 220 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/IotOperationMeetingController.java
  4. 86 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/vo/IotOperationMeetingPageReqVO.java
  5. 121 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/vo/IotOperationMeetingRespVO.java
  6. 20 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/vo/IotOperationMeetingSaveBatchVO.java
  7. 81 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/vo/IotOperationMeetingSaveReqVO.java
  8. 94 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeetingdetail/IotOperationMeetingDetailController.java
  9. 95 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeetingdetail/vo/IotOperationMeetingDetailPageReqVO.java
  10. 113 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeetingdetail/vo/IotOperationMeetingDetailRespVO.java
  11. 84 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeetingdetail/vo/IotOperationMeetingDetailSaveReqVO.java
  12. 118 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotoperationmeeting/IotOperationMeetingDO.java
  13. 122 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotoperationmeetingdetail/IotOperationMeetingDetailDO.java
  14. 45 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotoperationmeeting/IotOperationMeetingMapper.java
  15. 47 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotoperationmeetingdetail/IotOperationMeetingDetailMapper.java
  16. 60 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationmeeting/IotOperationMeetingService.java
  17. 158 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationmeeting/IotOperationMeetingServiceImpl.java
  18. 53 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationmeetingdetail/IotOperationMeetingDetailService.java
  19. 71 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationmeetingdetail/IotOperationMeetingDetailServiceImpl.java

+ 2 - 0
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java

@@ -103,4 +103,6 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_RD_DAILY_REPORT_DETAIL_NOT_EXISTS = new ErrorCode(278, "瑞都日报明细(生产动态拆分)不存在");
     ErrorCode IOT_RY_DAILY_REPORT_DETAIL_NOT_EXISTS = new ErrorCode(279, "瑞鹰日报明细(生产动态拆分)不存在");
     ErrorCode IOT_RD_NO_WORK_DAILY_REPORT_EXISTS = new ErrorCode(280, "无工作量日报已经存在");
+    ErrorCode IOT_OPERATION_MEETING_NOT_EXISTS = new ErrorCode(281, "生产运营会不存在");
+    ErrorCode IOT_OPERATION_MEETING_DETAIL_NOT_EXISTS = new ErrorCode(282, "生产运营会明细不存在");
 }

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/config/PmsDataPermissionConfiguration.java

@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.inspect.IotInspectOrderDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.inspect.IotInspectPlanDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeeting.IotOperationMeetingDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotsapstock.IotSapStockDO;
@@ -65,6 +66,7 @@ public class PmsDataPermissionConfiguration {
             rule.addDeptColumn(IotMeasureCertDO.class, "dept_id");
             rule.addDeptColumn(IotAccidentReportDO.class, "dept_id");
             rule.addDeptColumn(IotHazardDO.class, "dept_id");
+            rule.addDeptColumn(IotOperationMeetingDO.class, "dept_id");
             // user
 //            rule.addUserColumn(SupplierDO.class);
             rule.addUserColumn(AdminUserDO.class, "id");

+ 220 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/IotOperationMeetingController.java

@@ -0,0 +1,220 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingSaveBatchVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.IotOperationMeetingDetailPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.IotOperationMeetingDetailRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeeting.IotOperationMeetingDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeetingdetail.IotOperationMeetingDetailDO;
+import cn.iocoder.yudao.module.pms.service.iotoperationmeeting.IotOperationMeetingService;
+import cn.iocoder.yudao.module.pms.service.iotoperationmeetingdetail.IotOperationMeetingDetailService;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
+
+@Tag(name = "管理后台 - 生产运营会")
+@RestController
+@RequestMapping("/pms/iot-operation-meeting")
+@Validated
+public class IotOperationMeetingController {
+
+    @Resource
+    private IotOperationMeetingService iotOperationMeetingService;
+    @Resource
+    private IotOperationMeetingDetailService iotOperationMeetingDetailService;
+    @Resource
+    private DeptService deptService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建生产运营会")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting:create')")
+    public CommonResult<Long> createIotOperationMeeting(@Valid @RequestBody IotOperationMeetingSaveReqVO createReqVO) {
+        return success(iotOperationMeetingService.createIotOperationMeeting(createReqVO));
+    }
+
+    @PostMapping("/saveBatch")
+    @Operation(summary = "创建生产运营会 主表+明细")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting:create')")
+    public CommonResult<Long> saveBatch(@Valid @RequestBody IotOperationMeetingSaveBatchVO saveBatchVO) {
+        return success(iotOperationMeetingService.saveBatch(saveBatchVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新生产运营会")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting:update')")
+    public CommonResult<Boolean> updateIotOperationMeeting(@Valid @RequestBody IotOperationMeetingSaveReqVO updateReqVO) {
+        iotOperationMeetingService.updateIotOperationMeeting(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除生产运营会")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting:delete')")
+    public CommonResult<Boolean> deleteIotOperationMeeting(@RequestParam("id") Long id) {
+        iotOperationMeetingService.deleteIotOperationMeeting(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得生产运营会")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting:query')")
+    public CommonResult<IotOperationMeetingRespVO> getIotOperationMeeting(@RequestParam("id") Long id) {
+        IotOperationMeetingDO iotOperationMeeting = iotOperationMeetingService.getIotOperationMeeting(id);
+        return success(buildMeetingResp(iotOperationMeeting));
+        // return success(BeanUtils.toBean(iotOperationMeeting, IotOperationMeetingRespVO.class));
+    }
+
+    /**
+     * 查询 运营会 对应的明细
+     * @param operationMeeting
+     * @return
+     */
+    private IotOperationMeetingRespVO buildMeetingResp(IotOperationMeetingDO operationMeeting) {
+        if (ObjUtil.isEmpty(operationMeeting)) {
+            return new IotOperationMeetingRespVO();
+        }
+
+        IotOperationMeetingRespVO meetingResp = BeanUtils.toBean(operationMeeting, IotOperationMeetingRespVO.class);
+        // 设置公司名称
+        Long deptId = operationMeeting.getDeptId();
+        DeptDO dept = deptService.getDept(deptId);
+        if (ObjUtil.isNotEmpty(dept)) {
+            meetingResp.setCompanyName(dept.getName());
+        }
+        // 查询运营会明细
+        IotOperationMeetingDetailPageReqVO pageReqVO = new IotOperationMeetingDetailPageReqVO();
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        pageReqVO.setMeetingId(meetingResp.getId());
+        PageResult<IotOperationMeetingDetailDO> pageDetails = iotOperationMeetingDetailService.getIotOperationMeetingDetailPage(pageReqVO);
+        if (ObjUtil.isNotEmpty(pageDetails)) {
+            List<IotOperationMeetingDetailDO> details = pageDetails.getList();
+            List<IotOperationMeetingDetailRespVO> meetingDetails = BeanUtils.toBean(details, IotOperationMeetingDetailRespVO.class);
+            meetingResp.setDetails(meetingDetails);
+        }
+        return meetingResp;
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得生产运营会分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting:query')")
+    public CommonResult<PageResult<IotOperationMeetingRespVO>> getIotOperationMeetingPage(@Valid IotOperationMeetingPageReqVO pageReqVO) {
+        PageResult<IotOperationMeetingDO> pageResult = iotOperationMeetingService.getIotOperationMeetingPage(pageReqVO);
+        return success(new PageResult<>(buildMeetingDetails(pageResult.getList()), pageResult.getTotal()));
+        // return success(BeanUtils.toBean(pageResult, IotOperationMeetingRespVO.class));
+    }
+
+    /**
+     * 设置运营会明细相关的金额 收入 挂账 回款
+     * @param meetings 运营会列表
+     * @return
+     */
+    private List<IotOperationMeetingRespVO> buildMeetingDetails(List<IotOperationMeetingDO> meetings) {
+        if (CollUtil.isEmpty(meetings)) {
+            return Collections.emptyList();
+        }
+        // 查询每个运营会关联的公司
+        Map<Long, DeptDO> deptPair = deptService.getDeptMap(convertList(meetings, IotOperationMeetingDO::getDeptId));
+        List<Long> meetingIds = convertList(meetings, IotOperationMeetingDO::getId);
+        IotOperationMeetingDetailPageReqVO pageReqVO = new IotOperationMeetingDetailPageReqVO();
+        pageReqVO.setMeetingIds(meetingIds);
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        PageResult<IotOperationMeetingDetailDO> pageMeetingDetails = iotOperationMeetingDetailService.getIotOperationMeetingDetailPage(pageReqVO);
+        // 当期收入集合 key运营会id  value明细本期收入累加和
+        Map<Long, BigDecimal> currentRevenuePair = new HashMap<>();
+        // 当期挂账集合 key运营会id  value明细本期挂账累加和
+        Map<Long, BigDecimal> currentOnAccountPair = new HashMap<>();
+        // 当期回款集合 key运营会id  value明细本期回款累加和
+        Map<Long, BigDecimal> currentPaymentPair = new HashMap<>();
+        if (ObjUtil.isNotEmpty(pageMeetingDetails)) {
+            List<IotOperationMeetingDetailDO> details = pageMeetingDetails.getList();
+            // 计算每个运营会明细的本期 收入 挂账 回款 累加和
+            if (CollUtil.isNotEmpty(details)) {
+                details.forEach(detail -> {
+                    // 本期收入
+                    if (ObjUtil.isNotEmpty(detail.getCurrentRevenue())) {
+                        if (currentRevenuePair.containsKey(detail.getMeetingId())) {
+                            BigDecimal existRevenue = currentRevenuePair.get(detail.getMeetingId());
+                            BigDecimal tempRevenue = existRevenue.add(detail.getCurrentRevenue());
+                            currentRevenuePair.put(detail.getMeetingId(), tempRevenue);
+                        } else {
+                            currentRevenuePair.put(detail.getMeetingId(), detail.getCurrentRevenue());
+                        }
+                    }
+                    // 本期挂账
+                    if (ObjUtil.isNotEmpty(detail.getCurrentOnAccount())) {
+                        if (currentOnAccountPair.containsKey(detail.getMeetingId())) {
+                            BigDecimal existOnAccount = currentOnAccountPair.get(detail.getMeetingId());
+                            BigDecimal tempOnAccount = existOnAccount.add(detail.getCurrentOnAccount());
+                            currentOnAccountPair.put(detail.getMeetingId(), tempOnAccount);
+                        } else {
+                            currentOnAccountPair.put(detail.getMeetingId(), detail.getCurrentOnAccount());
+                        }
+                    }
+                    // 本期回款
+                    if (ObjUtil.isNotEmpty(detail.getCurrentPayment())) {
+                        if (currentPaymentPair.containsKey(detail.getMeetingId())) {
+                            BigDecimal existPayment = currentPaymentPair.get(detail.getMeetingId());
+                            BigDecimal tempPayment = existPayment.add(detail.getCurrentPayment());
+                            currentPaymentPair.put(detail.getMeetingId(), tempPayment);
+                        } else {
+                            currentPaymentPair.put(detail.getMeetingId(), detail.getCurrentPayment());
+                        }
+                    }
+                });
+            }
+        }
+        // 查询每个运营会对应的明细中的 本期 收入 挂账 回款 金额 总和
+        return BeanUtils.toBean(meetings, IotOperationMeetingRespVO.class, (meetingVO) -> {
+            findAndThen(deptPair, meetingVO.getDeptId(), dept -> meetingVO.setCompanyName(dept.getName()));
+            findAndThen(currentRevenuePair, meetingVO.getId(), currentRevenue -> meetingVO.setCurrentRevenue(currentRevenue));
+            findAndThen(currentOnAccountPair, meetingVO.getId(), currentOnAccount -> meetingVO.setCurrentOnAccount(currentOnAccount));
+            findAndThen(currentPaymentPair, meetingVO.getId(), currentPayment -> meetingVO.setCurrentPayment(currentPayment));
+        });
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出生产运营会 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotOperationMeetingExcel(@Valid IotOperationMeetingPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotOperationMeetingDO> list = iotOperationMeetingService.getIotOperationMeetingPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "生产运营会.xls", "数据", IotOperationMeetingRespVO.class,
+                        BeanUtils.toBean(list, IotOperationMeetingRespVO.class));
+    }
+
+}

+ 86 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/vo/IotOperationMeetingPageReqVO.java

@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo;
+
+import lombok.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 生产运营会分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotOperationMeetingPageReqVO extends PageParam {
+
+    @Schema(description = "公司id", example = "17383")
+    private Long companyId;
+
+    @Schema(description = "项目部id", example = "11299")
+    private Long deptId;
+
+    @Schema(description = "会议日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] meetingDate;
+
+    @Schema(description = "会议期次")
+    private String meetingSeries;
+
+    @Schema(description = "本期收入(万元)")
+    private BigDecimal currentRevenue;
+
+    @Schema(description = "累计收入(万元)")
+    private BigDecimal cumulativeRevenue;
+
+    @Schema(description = "本期挂账(万元)", example = "31247")
+    private BigDecimal currentOnAccount;
+
+    @Schema(description = "累计挂账(万元)", example = "23290")
+    private BigDecimal cumulativeOnAccount;
+
+    @Schema(description = "本期回款(万元)")
+    private BigDecimal currentPayment;
+
+    @Schema(description = "累计回款(万元)")
+    private BigDecimal cumulativePayment;
+
+    @Schema(description = "本期生产运行情况-计划工作量")
+    private String plannedWorkload;
+
+    @Schema(description = "本期生产运行情况-实际完成")
+    private String actualCompletion;
+
+    @Schema(description = "本期生产运行情况-设备利用率")
+    private String equipmentUtilizationRate;
+
+    @Schema(description = "生产管理情况及重点工作-重点工作及完成情况")
+    private String keyWorkCompletion;
+
+    @Schema(description = "生产管理情况及重点工作-存在问题及分析")
+    private String problemsAnalysis;
+
+    @Schema(description = "下期工作计划-计划工作量")
+    private String nextPlannedWorkload;
+
+    @Schema(description = "下期工作计划-重点工作事项")
+    private String priorityTasks;
+
+    @Schema(description = "需集团协调支持的事项")
+    private String support;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "随便")
+    private String remark;
+
+    @Schema(description = "状态(2填写中 0待填写 1已完成)", example = "1")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 121 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/vo/IotOperationMeetingRespVO.java

@@ -0,0 +1,121 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo;
+
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.IotOperationMeetingDetailRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 生产运营会 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotOperationMeetingRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1536")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "公司id", example = "17383")
+    private Long companyId;
+
+    @Schema(description = "公司名称", example = "瑞恒兴域")
+    @ExcelProperty("公司名称")
+    private String companyName;
+
+    @Schema(description = "项目部id", example = "11299")
+    @ExcelProperty("项目部id")
+    private Long deptId;
+
+    @Schema(description = "项目名称")
+    private String projectName;
+
+    @Schema(description = "会议日期")
+    @ExcelProperty("会议日期")
+    private LocalDateTime meetingDate;
+
+    @Schema(description = "会议期次")
+    @ExcelProperty("会议期次")
+    private String meetingSeries;
+
+    @Schema(description = "本期收入(万元)")
+    @ExcelProperty("本期收入(万元)")
+    private BigDecimal currentRevenue;
+
+    @Schema(description = "累计收入(万元)")
+    @ExcelProperty("累计收入(万元)")
+    private BigDecimal cumulativeRevenue;
+
+    @Schema(description = "本期挂账(万元)", example = "31247")
+    @ExcelProperty("本期挂账(万元)")
+    private BigDecimal currentOnAccount;
+
+    @Schema(description = "累计挂账(万元)", example = "23290")
+    @ExcelProperty("累计挂账(万元)")
+    private BigDecimal cumulativeOnAccount;
+
+    @Schema(description = "本期回款(万元)")
+    @ExcelProperty("本期回款(万元)")
+    private BigDecimal currentPayment;
+
+    @Schema(description = "累计回款(万元)")
+    @ExcelProperty("累计回款(万元)")
+    private BigDecimal cumulativePayment;
+
+    @Schema(description = "本期生产运行情况-计划工作量")
+    @ExcelProperty("本期生产运行情况-计划工作量")
+    private String plannedWorkload;
+
+    @Schema(description = "本期生产运行情况-实际完成")
+    @ExcelProperty("本期生产运行情况-实际完成")
+    private String actualCompletion;
+
+    @Schema(description = "本期生产运行情况-设备利用率")
+    @ExcelProperty("本期生产运行情况-设备利用率")
+    private String equipmentUtilizationRate;
+
+    @Schema(description = "生产管理情况及重点工作-重点工作及完成情况")
+    @ExcelProperty("生产管理情况及重点工作-重点工作及完成情况")
+    private String keyWorkCompletion;
+
+    @Schema(description = "生产管理情况及重点工作-存在问题及分析")
+    @ExcelProperty("生产管理情况及重点工作-存在问题及分析")
+    private String problemsAnalysis;
+
+    @Schema(description = "下期工作计划-计划工作量")
+    @ExcelProperty("下期工作计划-计划工作量")
+    private String nextPlannedWorkload;
+
+    @Schema(description = "下期工作计划-重点工作事项")
+    @ExcelProperty("下期工作计划-重点工作事项")
+    private String priorityTasks;
+
+    @Schema(description = "需集团协调支持的事项")
+    @ExcelProperty("需集团协调支持的事项")
+    private String support;
+
+    @Schema(description = "排序值")
+    @ExcelProperty("排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "随便")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "状态(2填写中 0待填写 1已完成)", example = "1")
+    @ExcelProperty("状态(2填写中 0待填写 1已完成)")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    /**
+     * 扩展字段 运营会明细
+     */
+    @Schema(description = "运营会明细", example = "...")
+    private List<IotOperationMeetingDetailRespVO> details;
+
+}

+ 20 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/vo/IotOperationMeetingSaveBatchVO.java

@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo;
+
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.IotOperationMeetingDetailSaveReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Schema(description = "管理后台 - 生产运营会新增/修改 Request VO")
+@Data
+public class IotOperationMeetingSaveBatchVO {
+
+    @Schema(description = "运营会议主表", example = "")
+    private IotOperationMeetingSaveReqVO operationMeeting;
+
+    @Schema(description = "运营会议材料明细", example = "")
+    private List<IotOperationMeetingDetailSaveReqVO> details = new ArrayList<>();
+
+}

+ 81 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/vo/IotOperationMeetingSaveReqVO.java

@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 生产运营会新增/修改 Request VO")
+@Data
+public class IotOperationMeetingSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1536")
+    private Long id;
+
+    @Schema(description = "公司id", example = "17383")
+    private Long companyId;
+
+    @Schema(description = "项目部id", example = "11299")
+    private Long deptId;
+
+    @Schema(description = "项目名称")
+    private String projectName;
+
+    @Schema(description = "会议日期")
+    private LocalDateTime meetingDate;
+
+    @Schema(description = "会议期次")
+    private String meetingSeries;
+
+    @Schema(description = "本期收入(万元)")
+    private BigDecimal currentRevenue;
+
+    @Schema(description = "累计收入(万元)")
+    private BigDecimal cumulativeRevenue;
+
+    @Schema(description = "本期挂账(万元)", example = "31247")
+    private BigDecimal currentOnAccount;
+
+    @Schema(description = "累计挂账(万元)", example = "23290")
+    private BigDecimal cumulativeOnAccount;
+
+    @Schema(description = "本期回款(万元)")
+    private BigDecimal currentPayment;
+
+    @Schema(description = "累计回款(万元)")
+    private BigDecimal cumulativePayment;
+
+    @Schema(description = "本期生产运行情况-计划工作量")
+    private String plannedWorkload;
+
+    @Schema(description = "本期生产运行情况-实际完成")
+    private String actualCompletion;
+
+    @Schema(description = "本期生产运行情况-设备利用率")
+    private String equipmentUtilizationRate;
+
+    @Schema(description = "生产管理情况及重点工作-重点工作及完成情况")
+    private String keyWorkCompletion;
+
+    @Schema(description = "生产管理情况及重点工作-存在问题及分析")
+    private String problemsAnalysis;
+
+    @Schema(description = "下期工作计划-计划工作量")
+    private String nextPlannedWorkload;
+
+    @Schema(description = "下期工作计划-重点工作事项")
+    private String priorityTasks;
+
+    @Schema(description = "需集团协调支持的事项")
+    private String support;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "随便")
+    private String remark;
+
+    @Schema(description = "状态(2填写中 0待填写 1已完成)", example = "1")
+    private Integer status;
+
+}

+ 94 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeetingdetail/IotOperationMeetingDetailController.java

@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.*;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeetingdetail.IotOperationMeetingDetailDO;
+import cn.iocoder.yudao.module.pms.service.iotoperationmeetingdetail.IotOperationMeetingDetailService;
+
+@Tag(name = "管理后台 - 生产运营会明细")
+@RestController
+@RequestMapping("/pms/iot-operation-meeting-detail")
+@Validated
+public class IotOperationMeetingDetailController {
+
+    @Resource
+    private IotOperationMeetingDetailService iotOperationMeetingDetailService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建生产运营会明细")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting-detail:create')")
+    public CommonResult<Long> createIotOperationMeetingDetail(@Valid @RequestBody IotOperationMeetingDetailSaveReqVO createReqVO) {
+        return success(iotOperationMeetingDetailService.createIotOperationMeetingDetail(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新生产运营会明细")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting-detail:update')")
+    public CommonResult<Boolean> updateIotOperationMeetingDetail(@Valid @RequestBody IotOperationMeetingDetailSaveReqVO updateReqVO) {
+        iotOperationMeetingDetailService.updateIotOperationMeetingDetail(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除生产运营会明细")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting-detail:delete')")
+    public CommonResult<Boolean> deleteIotOperationMeetingDetail(@RequestParam("id") Long id) {
+        iotOperationMeetingDetailService.deleteIotOperationMeetingDetail(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得生产运营会明细")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting-detail:query')")
+    public CommonResult<IotOperationMeetingDetailRespVO> getIotOperationMeetingDetail(@RequestParam("id") Long id) {
+        IotOperationMeetingDetailDO iotOperationMeetingDetail = iotOperationMeetingDetailService.getIotOperationMeetingDetail(id);
+        return success(BeanUtils.toBean(iotOperationMeetingDetail, IotOperationMeetingDetailRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得生产运营会明细分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting-detail:query')")
+    public CommonResult<PageResult<IotOperationMeetingDetailRespVO>> getIotOperationMeetingDetailPage(@Valid IotOperationMeetingDetailPageReqVO pageReqVO) {
+        PageResult<IotOperationMeetingDetailDO> pageResult = iotOperationMeetingDetailService.getIotOperationMeetingDetailPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotOperationMeetingDetailRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出生产运营会明细 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting-detail:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotOperationMeetingDetailExcel(@Valid IotOperationMeetingDetailPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotOperationMeetingDetailDO> list = iotOperationMeetingDetailService.getIotOperationMeetingDetailPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "生产运营会明细.xls", "数据", IotOperationMeetingDetailRespVO.class,
+                        BeanUtils.toBean(list, IotOperationMeetingDetailRespVO.class));
+    }
+
+}

+ 95 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeetingdetail/vo/IotOperationMeetingDetailPageReqVO.java

@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo;
+
+import lombok.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import java.util.Collection;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 生产运营会明细分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotOperationMeetingDetailPageReqVO extends PageParam {
+
+    @Schema(description = "运营会id", example = "25792")
+    private Long meetingId;
+
+    @Schema(description = "公司id", example = "15439")
+    private Long companyId;
+
+    @Schema(description = "项目部id", example = "8560")
+    private Long deptId;
+
+    @Schema(description = "会议日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] meetingDate;
+
+    @Schema(description = "会议期次")
+    private String meetingSeries;
+
+    @Schema(description = "本期收入(万元)")
+    private BigDecimal currentRevenue;
+
+    @Schema(description = "累计收入(万元)")
+    private BigDecimal cumulativeRevenue;
+
+    @Schema(description = "本期挂账(万元)", example = "27720")
+    private BigDecimal currentOnAccount;
+
+    @Schema(description = "累计挂账(万元)", example = "8899")
+    private BigDecimal cumulativeOnAccount;
+
+    @Schema(description = "本期回款(万元)")
+    private BigDecimal currentPayment;
+
+    @Schema(description = "累计回款(万元)")
+    private BigDecimal cumulativePayment;
+
+    @Schema(description = "本期生产运行情况-计划工作量")
+    private String plannedWorkload;
+
+    @Schema(description = "本期生产运行情况-实际完成")
+    private String actualCompletion;
+
+    @Schema(description = "本期生产运行情况-设备利用率")
+    private String equipmentUtilizationRate;
+
+    @Schema(description = "生产管理情况及重点工作-重点工作及完成情况")
+    private String keyWorkCompletion;
+
+    @Schema(description = "生产管理情况及重点工作-存在问题及分析")
+    private String problemsAnalysis;
+
+    @Schema(description = "下期工作计划-计划工作量")
+    private String nextPlannedWorkload;
+
+    @Schema(description = "下期工作计划-重点工作事项")
+    private String priorityTasks;
+
+    @Schema(description = "需集团协调支持的事项")
+    private String support;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "状态(2填写中 0待填写 1已完成)", example = "2")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "运营会id集合", example = "[123,456]")
+    private Collection<Long> meetingIds;
+}

+ 113 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeetingdetail/vo/IotOperationMeetingDetailRespVO.java

@@ -0,0 +1,113 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 生产运营会明细 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotOperationMeetingDetailRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "28089")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "运营会id", example = "25792")
+    @ExcelProperty("运营会id")
+    private Long meetingId;
+
+    @Schema(description = "公司id", example = "15439")
+    @ExcelProperty("公司id")
+    private Long companyId;
+
+    @Schema(description = "项目部id", example = "8560")
+    @ExcelProperty("项目部id")
+    private Long deptId;
+
+    @Schema(description = "项目名称")
+    private String projectName;
+
+    @Schema(description = "会议日期")
+    @ExcelProperty("会议日期")
+    private LocalDateTime meetingDate;
+
+    @Schema(description = "会议期次")
+    @ExcelProperty("会议期次")
+    private String meetingSeries;
+
+    @Schema(description = "本期收入(万元)")
+    @ExcelProperty("本期收入(万元)")
+    private BigDecimal currentRevenue;
+
+    @Schema(description = "累计收入(万元)")
+    @ExcelProperty("累计收入(万元)")
+    private BigDecimal cumulativeRevenue;
+
+    @Schema(description = "本期挂账(万元)", example = "27720")
+    @ExcelProperty("本期挂账(万元)")
+    private BigDecimal currentOnAccount;
+
+    @Schema(description = "累计挂账(万元)", example = "8899")
+    @ExcelProperty("累计挂账(万元)")
+    private BigDecimal cumulativeOnAccount;
+
+    @Schema(description = "本期回款(万元)")
+    @ExcelProperty("本期回款(万元)")
+    private BigDecimal currentPayment;
+
+    @Schema(description = "累计回款(万元)")
+    @ExcelProperty("累计回款(万元)")
+    private BigDecimal cumulativePayment;
+
+    @Schema(description = "本期生产运行情况-计划工作量")
+    @ExcelProperty("本期生产运行情况-计划工作量")
+    private String plannedWorkload;
+
+    @Schema(description = "本期生产运行情况-实际完成")
+    @ExcelProperty("本期生产运行情况-实际完成")
+    private String actualCompletion;
+
+    @Schema(description = "本期生产运行情况-设备利用率")
+    @ExcelProperty("本期生产运行情况-设备利用率")
+    private String equipmentUtilizationRate;
+
+    @Schema(description = "生产管理情况及重点工作-重点工作及完成情况")
+    @ExcelProperty("生产管理情况及重点工作-重点工作及完成情况")
+    private String keyWorkCompletion;
+
+    @Schema(description = "生产管理情况及重点工作-存在问题及分析")
+    @ExcelProperty("生产管理情况及重点工作-存在问题及分析")
+    private String problemsAnalysis;
+
+    @Schema(description = "下期工作计划-计划工作量")
+    @ExcelProperty("下期工作计划-计划工作量")
+    private String nextPlannedWorkload;
+
+    @Schema(description = "下期工作计划-重点工作事项")
+    @ExcelProperty("下期工作计划-重点工作事项")
+    private String priorityTasks;
+
+    @Schema(description = "需集团协调支持的事项")
+    @ExcelProperty("需集团协调支持的事项")
+    private String support;
+
+    @Schema(description = "排序值")
+    @ExcelProperty("排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "状态(2填写中 0待填写 1已完成)", example = "2")
+    @ExcelProperty("状态(2填写中 0待填写 1已完成)")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 84 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeetingdetail/vo/IotOperationMeetingDetailSaveReqVO.java

@@ -0,0 +1,84 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 生产运营会明细新增/修改 Request VO")
+@Data
+public class IotOperationMeetingDetailSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "28089")
+    private Long id;
+
+    @Schema(description = "运营会id", example = "25792")
+    private Long meetingId;
+
+    @Schema(description = "公司id", example = "15439")
+    private Long companyId;
+
+    @Schema(description = "项目部id", example = "8560")
+    private Long deptId;
+
+    @Schema(description = "项目名称")
+    private String projectName;
+
+    @Schema(description = "会议日期")
+    private LocalDateTime meetingDate;
+
+    @Schema(description = "会议期次")
+    private String meetingSeries;
+
+    @Schema(description = "本期收入(万元)")
+    private BigDecimal currentRevenue;
+
+    @Schema(description = "累计收入(万元)")
+    private BigDecimal cumulativeRevenue;
+
+    @Schema(description = "本期挂账(万元)", example = "27720")
+    private BigDecimal currentOnAccount;
+
+    @Schema(description = "累计挂账(万元)", example = "8899")
+    private BigDecimal cumulativeOnAccount;
+
+    @Schema(description = "本期回款(万元)")
+    private BigDecimal currentPayment;
+
+    @Schema(description = "累计回款(万元)")
+    private BigDecimal cumulativePayment;
+
+    @Schema(description = "本期生产运行情况-计划工作量")
+    private String plannedWorkload;
+
+    @Schema(description = "本期生产运行情况-实际完成")
+    private String actualCompletion;
+
+    @Schema(description = "本期生产运行情况-设备利用率")
+    private String equipmentUtilizationRate;
+
+    @Schema(description = "生产管理情况及重点工作-重点工作及完成情况")
+    private String keyWorkCompletion;
+
+    @Schema(description = "生产管理情况及重点工作-存在问题及分析")
+    private String problemsAnalysis;
+
+    @Schema(description = "下期工作计划-计划工作量")
+    private String nextPlannedWorkload;
+
+    @Schema(description = "下期工作计划-重点工作事项")
+    private String priorityTasks;
+
+    @Schema(description = "需集团协调支持的事项")
+    private String support;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "状态(2填写中 0待填写 1已完成)", example = "2")
+    private Integer status;
+
+}

+ 118 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotoperationmeeting/IotOperationMeetingDO.java

@@ -0,0 +1,118 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeeting;
+
+import lombok.*;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 生产运营会 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rq_iot_operation_meeting")
+@KeySequence("rq_iot_operation_meeting_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotOperationMeetingDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 公司id
+     */
+    private Long companyId;
+    /**
+     * 项目部id
+     */
+    private Long deptId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 会议日期
+     */
+    private LocalDateTime meetingDate;
+    /**
+     * 会议期次
+     */
+    private String meetingSeries;
+    /**
+     * 本期收入(万元)
+     */
+    private BigDecimal currentRevenue;
+    /**
+     * 累计收入(万元)
+     */
+    private BigDecimal cumulativeRevenue;
+    /**
+     * 本期挂账(万元)
+     */
+    private BigDecimal currentOnAccount;
+    /**
+     * 累计挂账(万元)
+     */
+    private BigDecimal cumulativeOnAccount;
+    /**
+     * 本期回款(万元)
+     */
+    private BigDecimal currentPayment;
+    /**
+     * 累计回款(万元)
+     */
+    private BigDecimal cumulativePayment;
+    /**
+     * 本期生产运行情况-计划工作量
+     */
+    private String plannedWorkload;
+    /**
+     * 本期生产运行情况-实际完成
+     */
+    private String actualCompletion;
+    /**
+     * 本期生产运行情况-设备利用率
+     */
+    private String equipmentUtilizationRate;
+    /**
+     * 生产管理情况及重点工作-重点工作及完成情况
+     */
+    private String keyWorkCompletion;
+    /**
+     * 生产管理情况及重点工作-存在问题及分析
+     */
+    private String problemsAnalysis;
+    /**
+     * 下期工作计划-计划工作量
+     */
+    private String nextPlannedWorkload;
+    /**
+     * 下期工作计划-重点工作事项
+     */
+    private String priorityTasks;
+    /**
+     * 需集团协调支持的事项
+     */
+    private String support;
+    /**
+     * 排序值
+     */
+    private Integer sort;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态(2填写中 0待填写 1已完成)
+     */
+    private Integer status;
+
+}

+ 122 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotoperationmeetingdetail/IotOperationMeetingDetailDO.java

@@ -0,0 +1,122 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeetingdetail;
+
+import lombok.*;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 生产运营会明细 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rq_iot_operation_meeting_detail")
+@KeySequence("rq_iot_operation_meeting_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotOperationMeetingDetailDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 运营会id
+     */
+    private Long meetingId;
+    /**
+     * 公司id
+     */
+    private Long companyId;
+    /**
+     * 项目部id
+     */
+    private Long deptId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 会议日期
+     */
+    private LocalDateTime meetingDate;
+    /**
+     * 会议期次
+     */
+    private String meetingSeries;
+    /**
+     * 本期收入(万元)
+     */
+    private BigDecimal currentRevenue;
+    /**
+     * 累计收入(万元)
+     */
+    private BigDecimal cumulativeRevenue;
+    /**
+     * 本期挂账(万元)
+     */
+    private BigDecimal currentOnAccount;
+    /**
+     * 累计挂账(万元)
+     */
+    private BigDecimal cumulativeOnAccount;
+    /**
+     * 本期回款(万元)
+     */
+    private BigDecimal currentPayment;
+    /**
+     * 累计回款(万元)
+     */
+    private BigDecimal cumulativePayment;
+    /**
+     * 本期生产运行情况-计划工作量
+     */
+    private String plannedWorkload;
+    /**
+     * 本期生产运行情况-实际完成
+     */
+    private String actualCompletion;
+    /**
+     * 本期生产运行情况-设备利用率
+     */
+    private String equipmentUtilizationRate;
+    /**
+     * 生产管理情况及重点工作-重点工作及完成情况
+     */
+    private String keyWorkCompletion;
+    /**
+     * 生产管理情况及重点工作-存在问题及分析
+     */
+    private String problemsAnalysis;
+    /**
+     * 下期工作计划-计划工作量
+     */
+    private String nextPlannedWorkload;
+    /**
+     * 下期工作计划-重点工作事项
+     */
+    private String priorityTasks;
+    /**
+     * 需集团协调支持的事项
+     */
+    private String support;
+    /**
+     * 排序值
+     */
+    private Integer sort;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态(2填写中 0待填写 1已完成)
+     */
+    private Integer status;
+
+}

+ 45 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotoperationmeeting/IotOperationMeetingMapper.java

@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotoperationmeeting;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeeting.IotOperationMeetingDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.*;
+
+/**
+ * 生产运营会 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface IotOperationMeetingMapper extends BaseMapperX<IotOperationMeetingDO> {
+
+    default PageResult<IotOperationMeetingDO> selectPage(IotOperationMeetingPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotOperationMeetingDO>()
+                .eqIfPresent(IotOperationMeetingDO::getCompanyId, reqVO.getCompanyId())
+                .eqIfPresent(IotOperationMeetingDO::getDeptId, reqVO.getDeptId())
+                .betweenIfPresent(IotOperationMeetingDO::getMeetingDate, reqVO.getMeetingDate())
+                .eqIfPresent(IotOperationMeetingDO::getMeetingSeries, reqVO.getMeetingSeries())
+                .eqIfPresent(IotOperationMeetingDO::getCurrentRevenue, reqVO.getCurrentRevenue())
+                .eqIfPresent(IotOperationMeetingDO::getCumulativeRevenue, reqVO.getCumulativeRevenue())
+                .eqIfPresent(IotOperationMeetingDO::getCurrentOnAccount, reqVO.getCurrentOnAccount())
+                .eqIfPresent(IotOperationMeetingDO::getCumulativeOnAccount, reqVO.getCumulativeOnAccount())
+                .eqIfPresent(IotOperationMeetingDO::getCurrentPayment, reqVO.getCurrentPayment())
+                .eqIfPresent(IotOperationMeetingDO::getCumulativePayment, reqVO.getCumulativePayment())
+                .eqIfPresent(IotOperationMeetingDO::getPlannedWorkload, reqVO.getPlannedWorkload())
+                .eqIfPresent(IotOperationMeetingDO::getActualCompletion, reqVO.getActualCompletion())
+                .eqIfPresent(IotOperationMeetingDO::getEquipmentUtilizationRate, reqVO.getEquipmentUtilizationRate())
+                .eqIfPresent(IotOperationMeetingDO::getKeyWorkCompletion, reqVO.getKeyWorkCompletion())
+                .eqIfPresent(IotOperationMeetingDO::getProblemsAnalysis, reqVO.getProblemsAnalysis())
+                .eqIfPresent(IotOperationMeetingDO::getNextPlannedWorkload, reqVO.getNextPlannedWorkload())
+                .eqIfPresent(IotOperationMeetingDO::getPriorityTasks, reqVO.getPriorityTasks())
+                .eqIfPresent(IotOperationMeetingDO::getSupport, reqVO.getSupport())
+                .eqIfPresent(IotOperationMeetingDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotOperationMeetingDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotOperationMeetingDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(IotOperationMeetingDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotOperationMeetingDO::getId));
+    }
+
+}

+ 47 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotoperationmeetingdetail/IotOperationMeetingDetailMapper.java

@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotoperationmeetingdetail;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeetingdetail.IotOperationMeetingDetailDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.*;
+
+/**
+ * 生产运营会明细 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface IotOperationMeetingDetailMapper extends BaseMapperX<IotOperationMeetingDetailDO> {
+
+    default PageResult<IotOperationMeetingDetailDO> selectPage(IotOperationMeetingDetailPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotOperationMeetingDetailDO>()
+                .eqIfPresent(IotOperationMeetingDetailDO::getMeetingId, reqVO.getMeetingId())
+                .inIfPresent(IotOperationMeetingDetailDO::getMeetingId, reqVO.getMeetingIds())
+                .eqIfPresent(IotOperationMeetingDetailDO::getCompanyId, reqVO.getCompanyId())
+                .eqIfPresent(IotOperationMeetingDetailDO::getDeptId, reqVO.getDeptId())
+                .betweenIfPresent(IotOperationMeetingDetailDO::getMeetingDate, reqVO.getMeetingDate())
+                .eqIfPresent(IotOperationMeetingDetailDO::getMeetingSeries, reqVO.getMeetingSeries())
+                .eqIfPresent(IotOperationMeetingDetailDO::getCurrentRevenue, reqVO.getCurrentRevenue())
+                .eqIfPresent(IotOperationMeetingDetailDO::getCumulativeRevenue, reqVO.getCumulativeRevenue())
+                .eqIfPresent(IotOperationMeetingDetailDO::getCurrentOnAccount, reqVO.getCurrentOnAccount())
+                .eqIfPresent(IotOperationMeetingDetailDO::getCumulativeOnAccount, reqVO.getCumulativeOnAccount())
+                .eqIfPresent(IotOperationMeetingDetailDO::getCurrentPayment, reqVO.getCurrentPayment())
+                .eqIfPresent(IotOperationMeetingDetailDO::getCumulativePayment, reqVO.getCumulativePayment())
+                .eqIfPresent(IotOperationMeetingDetailDO::getPlannedWorkload, reqVO.getPlannedWorkload())
+                .eqIfPresent(IotOperationMeetingDetailDO::getActualCompletion, reqVO.getActualCompletion())
+                .eqIfPresent(IotOperationMeetingDetailDO::getEquipmentUtilizationRate, reqVO.getEquipmentUtilizationRate())
+                .eqIfPresent(IotOperationMeetingDetailDO::getKeyWorkCompletion, reqVO.getKeyWorkCompletion())
+                .eqIfPresent(IotOperationMeetingDetailDO::getProblemsAnalysis, reqVO.getProblemsAnalysis())
+                .eqIfPresent(IotOperationMeetingDetailDO::getNextPlannedWorkload, reqVO.getNextPlannedWorkload())
+                .eqIfPresent(IotOperationMeetingDetailDO::getPriorityTasks, reqVO.getPriorityTasks())
+                .eqIfPresent(IotOperationMeetingDetailDO::getSupport, reqVO.getSupport())
+                .eqIfPresent(IotOperationMeetingDetailDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotOperationMeetingDetailDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotOperationMeetingDetailDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(IotOperationMeetingDetailDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotOperationMeetingDetailDO::getId));
+    }
+
+}

+ 60 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationmeeting/IotOperationMeetingService.java

@@ -0,0 +1,60 @@
+package cn.iocoder.yudao.module.pms.service.iotoperationmeeting;
+
+import javax.validation.*;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.*;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeeting.IotOperationMeetingDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+
+/**
+ * 生产运营会 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface IotOperationMeetingService {
+
+    /**
+     * 创建生产运营会
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotOperationMeeting(@Valid IotOperationMeetingSaveReqVO createReqVO);
+
+    /**
+     * 更新生产运营会
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotOperationMeeting(@Valid IotOperationMeetingSaveReqVO updateReqVO);
+
+    /**
+     * 删除生产运营会
+     *
+     * @param id 编号
+     */
+    void deleteIotOperationMeeting(Long id);
+
+    /**
+     * 获得生产运营会
+     *
+     * @param id 编号
+     * @return 生产运营会
+     */
+    IotOperationMeetingDO getIotOperationMeeting(Long id);
+
+    /**
+     * 获得生产运营会分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 生产运营会分页
+     */
+    PageResult<IotOperationMeetingDO> getIotOperationMeetingPage(IotOperationMeetingPageReqVO pageReqVO);
+
+    /**
+     * 批量保存生产运营会 主表+明细
+     *
+     * @param saveBatchVO 保存对象
+     * @return 保存记录数
+     */
+    Long saveBatch(IotOperationMeetingSaveBatchVO saveBatchVO);
+}

+ 158 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationmeeting/IotOperationMeetingServiceImpl.java

@@ -0,0 +1,158 @@
+package cn.iocoder.yudao.module.pms.service.iotoperationmeeting;
+
+import cn.hutool.core.util.ObjUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingSaveBatchVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.IotOperationMeetingDetailSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeeting.IotOperationMeetingDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeetingdetail.IotOperationMeetingDetailDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotoperationmeeting.IotOperationMeetingMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotoperationmeetingdetail.IotOperationMeetingDetailMapper;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
+import com.google.common.collect.ImmutableMap;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_OPERATION_MEETING_NOT_EXISTS;
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.DEPT_NOT_FOUND;
+
+/**
+ * 生产运营会 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class IotOperationMeetingServiceImpl implements IotOperationMeetingService {
+
+    @Resource
+    private IotOperationMeetingMapper iotOperationMeetingMapper;
+    @Resource
+    private IotOperationMeetingDetailMapper iotOperationMeetingDetailMapper;
+    @Resource
+    private DeptService deptservice;
+
+    @Override
+    public Long createIotOperationMeeting(IotOperationMeetingSaveReqVO createReqVO) {
+        // 插入
+        IotOperationMeetingDO iotOperationMeeting = BeanUtils.toBean(createReqVO, IotOperationMeetingDO.class);
+        // 如果没有传递 公司 参数 则获得当前登录人所属公司
+        if (ObjUtil.isEmpty(iotOperationMeeting.getDeptId())) {
+            // 查询当前登录人所属公司
+            Long loginUserDeptId = SecurityFrameworkUtils.getLoginUserDeptId();
+            DeptDO dept = deptservice.getDept(loginUserDeptId);
+            if (ObjUtil.isEmpty(dept)) {
+                throw exception(DEPT_NOT_FOUND);
+            }
+            if (!"1".equals(dept.getType())) {
+                throw new AccessDeniedException("没有权限");
+            }
+            iotOperationMeeting.setDeptId(loginUserDeptId);
+        }
+        iotOperationMeetingMapper.insert(iotOperationMeeting);
+        // 返回
+        return iotOperationMeeting.getId();
+    }
+
+    @Override
+    public void updateIotOperationMeeting(IotOperationMeetingSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotOperationMeetingExists(updateReqVO.getId());
+        // 更新
+        IotOperationMeetingDO updateObj = BeanUtils.toBean(updateReqVO, IotOperationMeetingDO.class);
+        iotOperationMeetingMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotOperationMeeting(Long id) {
+        // 校验存在
+        validateIotOperationMeetingExists(id);
+        // 删除
+        iotOperationMeetingMapper.deleteById(id);
+    }
+
+    private void validateIotOperationMeetingExists(Long id) {
+        if (iotOperationMeetingMapper.selectById(id) == null) {
+            throw exception(IOT_OPERATION_MEETING_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotOperationMeetingDO getIotOperationMeeting(Long id) {
+        return iotOperationMeetingMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotOperationMeetingDO> getIotOperationMeetingPage(IotOperationMeetingPageReqVO pageReqVO) {
+        return iotOperationMeetingMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public Long saveBatch(IotOperationMeetingSaveBatchVO saveBatchVO) {
+        if (ObjUtil.isEmpty(saveBatchVO)) {
+            throw exception(IOT_OPERATION_MEETING_NOT_EXISTS);
+        }
+        // 兼容 新增 编辑
+        if (ObjUtil.isEmpty(saveBatchVO.getOperationMeeting())) {
+            throw exception(IOT_OPERATION_MEETING_NOT_EXISTS);
+        }
+        IotOperationMeetingSaveReqVO meeting = saveBatchVO.getOperationMeeting();
+        // 如果没有传递 公司 参数 则获得当前登录人所属公司
+        if (ObjUtil.isEmpty(meeting.getDeptId())) {
+            // 查询当前登录人所属公司
+            Long loginUserDeptId = SecurityFrameworkUtils.getLoginUserDeptId();
+            DeptDO dept = deptservice.getDept(loginUserDeptId);
+            if (ObjUtil.isEmpty(dept)) {
+                throw exception(DEPT_NOT_FOUND);
+            }
+            if (!"1".equals(dept.getType())) {
+                throw new AccessDeniedException("没有权限");
+            }
+            meeting.setDeptId(loginUserDeptId);
+        }
+        List<Long> meetingIds = new ArrayList<>();
+        if (ObjUtil.isNotEmpty(meeting.getId())) {
+            // 更新
+            // 校验存在
+            validateIotOperationMeetingExists(meeting.getId());
+            IotOperationMeetingDO updateObj = BeanUtils.toBean(meeting, IotOperationMeetingDO.class);
+            iotOperationMeetingMapper.updateById(updateObj);
+            // 删除主表对应的明细
+            int count = iotOperationMeetingDetailMapper.deleteByMap(ImmutableMap.of(
+                    "meeting_id", meeting.getId()
+            ));
+            meetingIds.add(updateObj.getId());
+        } else {
+            // 新增
+            IotOperationMeetingDO iotOperationMeeting = BeanUtils.toBean(meeting, IotOperationMeetingDO.class);
+            iotOperationMeetingMapper.insert(iotOperationMeeting);
+            meetingIds.add(iotOperationMeeting.getId());
+        }
+        // 编辑时先删除明细 再新增明细
+        if (ObjUtil.isNotEmpty(saveBatchVO.getDetails())) {
+            List<IotOperationMeetingDetailSaveReqVO> details = saveBatchVO.getDetails();
+            List<IotOperationMeetingDetailDO> meetingDetails = new ArrayList<>();
+            details.forEach(detail -> {
+                IotOperationMeetingDetailDO detailDO = BeanUtils.toBean(detail, IotOperationMeetingDetailDO.class);
+                detailDO.setId(null);
+                detailDO.setMeetingId(meetingIds.get(0));
+                detailDO.setDeptId(meeting.getDeptId());
+                meetingDetails.add(detailDO);
+            });
+            iotOperationMeetingDetailMapper.insertBatch(meetingDetails);
+        }
+        return 0l;
+    }
+
+}

+ 53 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationmeetingdetail/IotOperationMeetingDetailService.java

@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.pms.service.iotoperationmeetingdetail;
+
+import javax.validation.*;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.*;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeetingdetail.IotOperationMeetingDetailDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+
+/**
+ * 生产运营会明细 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface IotOperationMeetingDetailService {
+
+    /**
+     * 创建生产运营会明细
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotOperationMeetingDetail(@Valid IotOperationMeetingDetailSaveReqVO createReqVO);
+
+    /**
+     * 更新生产运营会明细
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotOperationMeetingDetail(@Valid IotOperationMeetingDetailSaveReqVO updateReqVO);
+
+    /**
+     * 删除生产运营会明细
+     *
+     * @param id 编号
+     */
+    void deleteIotOperationMeetingDetail(Long id);
+
+    /**
+     * 获得生产运营会明细
+     *
+     * @param id 编号
+     * @return 生产运营会明细
+     */
+    IotOperationMeetingDetailDO getIotOperationMeetingDetail(Long id);
+
+    /**
+     * 获得生产运营会明细分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 生产运营会明细分页
+     */
+    PageResult<IotOperationMeetingDetailDO> getIotOperationMeetingDetailPage(IotOperationMeetingDetailPageReqVO pageReqVO);
+
+}

+ 71 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationmeetingdetail/IotOperationMeetingDetailServiceImpl.java

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.pms.service.iotoperationmeetingdetail;
+
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.*;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeetingdetail.IotOperationMeetingDetailDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.pms.dal.mysql.iotoperationmeetingdetail.IotOperationMeetingDetailMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_OPERATION_MEETING_DETAIL_NOT_EXISTS;
+
+/**
+ * 生产运营会明细 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class IotOperationMeetingDetailServiceImpl implements IotOperationMeetingDetailService {
+
+    @Resource
+    private IotOperationMeetingDetailMapper iotOperationMeetingDetailMapper;
+
+    @Override
+    public Long createIotOperationMeetingDetail(IotOperationMeetingDetailSaveReqVO createReqVO) {
+        // 插入
+        IotOperationMeetingDetailDO iotOperationMeetingDetail = BeanUtils.toBean(createReqVO, IotOperationMeetingDetailDO.class);
+        iotOperationMeetingDetailMapper.insert(iotOperationMeetingDetail);
+        // 返回
+        return iotOperationMeetingDetail.getId();
+    }
+
+    @Override
+    public void updateIotOperationMeetingDetail(IotOperationMeetingDetailSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotOperationMeetingDetailExists(updateReqVO.getId());
+        // 更新
+        IotOperationMeetingDetailDO updateObj = BeanUtils.toBean(updateReqVO, IotOperationMeetingDetailDO.class);
+        iotOperationMeetingDetailMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotOperationMeetingDetail(Long id) {
+        // 校验存在
+        validateIotOperationMeetingDetailExists(id);
+        // 删除
+        iotOperationMeetingDetailMapper.deleteById(id);
+    }
+
+    private void validateIotOperationMeetingDetailExists(Long id) {
+        if (iotOperationMeetingDetailMapper.selectById(id) == null) {
+            throw exception(IOT_OPERATION_MEETING_DETAIL_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotOperationMeetingDetailDO getIotOperationMeetingDetail(Long id) {
+        return iotOperationMeetingDetailMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotOperationMeetingDetailDO> getIotOperationMeetingDetailPage(IotOperationMeetingDetailPageReqVO pageReqVO) {
+        return iotOperationMeetingDetailMapper.selectPage(pageReqVO);
+    }
+
+}