Explorar el Código

LY 合成器修改

ly hace 1 año
padre
commit
8294a0e08b
Se han modificado 50 ficheros con 4847 adiciones y 87 borrados
  1. 1 1
      master/src/main/java/com/ruoyi/common/sendEmail/IMailService.java
  2. 33 0
      master/src/main/java/com/ruoyi/common/sendEmail/IMailServiceImpl.java
  3. 2 6
      master/src/main/java/com/ruoyi/project/common/controller/CBPSHomeDataController.java
  4. 132 0
      master/src/main/java/com/ruoyi/project/plant/controller/TMtdConfigController.java
  5. 205 0
      master/src/main/java/com/ruoyi/project/plant/controller/TMtdDailyController.java
  6. 103 0
      master/src/main/java/com/ruoyi/project/plant/controller/TMtdItemController.java
  7. 26 3
      master/src/main/java/com/ruoyi/project/plant/controller/TStaffmgrController.java
  8. 115 0
      master/src/main/java/com/ruoyi/project/plant/domain/TMtdConfig.java
  9. 419 0
      master/src/main/java/com/ruoyi/project/plant/domain/TMtdDaily.java
  10. 190 0
      master/src/main/java/com/ruoyi/project/plant/domain/TMtdItem.java
  11. 63 0
      master/src/main/java/com/ruoyi/project/plant/mapper/TMtdConfigMapper.java
  12. 63 0
      master/src/main/java/com/ruoyi/project/plant/mapper/TMtdDailyMapper.java
  13. 65 0
      master/src/main/java/com/ruoyi/project/plant/mapper/TMtdItemMapper.java
  14. 8 3
      master/src/main/java/com/ruoyi/project/plant/mapper/TStaffmgrMapper.java
  15. 61 0
      master/src/main/java/com/ruoyi/project/plant/service/ITMtdConfigService.java
  16. 61 0
      master/src/main/java/com/ruoyi/project/plant/service/ITMtdDailyService.java
  17. 61 0
      master/src/main/java/com/ruoyi/project/plant/service/ITMtdItemService.java
  18. 96 0
      master/src/main/java/com/ruoyi/project/plant/service/impl/TMtdConfigServiceImpl.java
  19. 167 0
      master/src/main/java/com/ruoyi/project/plant/service/impl/TMtdDailyServiceImpl.java
  20. 95 0
      master/src/main/java/com/ruoyi/project/plant/service/impl/TMtdItemServiceImpl.java
  21. 18 2
      master/src/main/java/com/ruoyi/project/training/controller/TTrainingDeviceController.java
  22. 2 2
      master/src/main/java/com/ruoyi/project/training/newstaff/controller/TTnNewController.java
  23. 4 4
      master/src/main/resources/application.yml
  24. 99 0
      master/src/main/resources/mybatis/plant/TMtdConfigMapper.xml
  25. 160 0
      master/src/main/resources/mybatis/plant/TMtdDailyMapper.xml
  26. 122 0
      master/src/main/resources/mybatis/plant/TMtdItemMapper.xml
  27. 249 21
      master/src/main/resources/mybatis/plant/TStaffmgrMapper.xml
  28. 2 0
      master/src/main/resources/mybatis/training/TTrainingMapper.xml
  29. 1 0
      master/src/main/resources/mybatis/training/newstaff/TTnNewMapper.xml
  30. 2 1
      ui/src/api/common/homedataCbpb.js
  31. 62 0
      ui/src/api/plant/dailyMeeting.js
  32. 53 0
      ui/src/api/plant/dailyMeetingConfig.js
  33. 53 0
      ui/src/api/plant/dailyMeetingitem.js
  34. 9 0
      ui/src/api/plant/staffmgr.js
  35. 2 1
      ui/src/api/training/newstaff/tnNew.js
  36. 19 0
      ui/src/router/index.js
  37. 11 0
      ui/src/views/dashboard/hcq/BrithChart.vue
  38. 13 7
      ui/src/views/dashboard/hcq/PieChart.vue
  39. 25 9
      ui/src/views/hcqhome.vue
  40. 432 0
      ui/src/views/plant/dailyMeeting/detail.vue
  41. 451 0
      ui/src/views/plant/dailyMeeting/index.vue
  42. 382 0
      ui/src/views/plant/dailyMeetingConfig/index.vue
  43. 502 0
      ui/src/views/plant/dailyMeetingitem/index.vue
  44. 27 11
      ui/src/views/plant/organization/index.vue
  45. 103 0
      ui/src/views/plant/staffmgr/ageChart.vue
  46. 15 4
      ui/src/views/plant/staffmgr/eduChart.vue
  47. 15 5
      ui/src/views/plant/staffmgr/engChart.vue
  48. 18 4
      ui/src/views/plant/staffmgr/index.vue
  49. 14 3
      ui/src/views/plant/staffmgr/teamChart.vue
  50. 16 0
      ui/src/views/training/training/index.vue

+ 1 - 1
master/src/main/java/com/ruoyi/common/sendEmail/IMailService.java

@@ -27,7 +27,7 @@ public interface IMailService {
      * @param content 内容
      */
     public void sendHtmlMail(String to, String subject, String content, String cc);
-
+    public void sendHtmlMail(String[] to, String subject, String content, String cc[]);
     /**
      * 发送带附件的邮件
      *

+ 33 - 0
master/src/main/java/com/ruoyi/common/sendEmail/IMailServiceImpl.java

@@ -130,6 +130,39 @@ public class IMailServiceImpl implements IMailService {
         }
     }
 
+    /**
+     * 多人html邮件
+     *
+     * @param to      收件人
+     * @param subject 主题
+     * @param content 内容
+     */
+    @Override
+    public void sendHtmlMail(String[] to, String subject, String content, String cc[]) {
+        //获取MimeMessage对象
+        MimeMessage message = mailSender.createMimeMessage();
+        MimeMessageHelper messageHelper;
+        try {
+            messageHelper = new MimeMessageHelper(message, true);
+            //邮件发送人
+            messageHelper.setFrom(from);
+            //邮件接收人
+            messageHelper.setTo(to);
+            //邮件发送人
+            messageHelper.setCc(cc);
+            //邮件主题
+            message.setSubject(subject);
+            //邮件内容,html格式
+            messageHelper.setText(content, true);
+            //发送
+            mailSender.send(message);
+            //日志信息
+            logger.info("邮件已经发送。");
+        } catch (Exception e) {
+            logger.error("发送邮件时发生异常!", e);
+        }
+    }
+
 
     /**
      * 带附件的邮件

+ 2 - 6
master/src/main/java/com/ruoyi/project/common/controller/CBPSHomeDataController.java

@@ -4,10 +4,7 @@ import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.project.document.domain.TPlantproglist;
 import com.ruoyi.project.document.service.ITPlantproglistService;
-import com.ruoyi.project.ehs.domain.TEnvironapproval;
-import com.ruoyi.project.ehs.domain.TFireapproval;
-import com.ruoyi.project.ehs.domain.THealthapproval;
-import com.ruoyi.project.ehs.domain.TSafetyapproval;
+import com.ruoyi.project.ehs.domain.*;
 import com.ruoyi.project.ehs.service.ITEnvironapprovalService;
 import com.ruoyi.project.ehs.service.ITFireapprovalService;
 import com.ruoyi.project.ehs.service.ITHealthapprovalService;
@@ -170,8 +167,7 @@ public class CBPSHomeDataController extends BaseController {
 //    }
 
     @GetMapping("/trainCount")
-    public AjaxResult getTrainCount() {
-        TTraining tTraining = new TTraining();
+    public AjaxResult getTrainCount(TTraining tTraining) {
         tTraining.setDeptId(10012l);
         tTraining.setIsfinish(1l);
         List<TTraining> list1 = tTrainingService.selectTTrainingList(tTraining);

+ 132 - 0
master/src/main/java/com/ruoyi/project/plant/controller/TMtdConfigController.java

@@ -0,0 +1,132 @@
+package com.ruoyi.project.plant.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.ruoyi.project.system.domain.SysDictData;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+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.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.project.plant.domain.TMtdConfig;
+import com.ruoyi.project.plant.service.ITMtdConfigService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.page.TableDataInfo;
+
+import javax.annotation.Resource;
+
+/**
+ * 调度会议配置Controller
+ *
+ * @author ssy
+ * @date 2023-11-16
+ */
+@RestController
+@RequestMapping("/plant/dailyMeetingConfig")
+public class TMtdConfigController extends BaseController
+{
+    @Autowired
+    private ITMtdConfigService tMtdConfigService;
+    @Resource
+    private SysUserMapper userMapper;
+
+    /**
+     * 查询调度会议配置列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(TMtdConfig tMtdConfig)
+    {
+        startPage();
+        List<TMtdConfig> list = tMtdConfigService.selectTMtdConfigList(tMtdConfig);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出调度会议配置列表
+     */
+    @Log(title = "调度会议配置", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(TMtdConfig tMtdConfig)
+    {
+        List<TMtdConfig> list = tMtdConfigService.selectTMtdConfigList(tMtdConfig);
+        ExcelUtil<TMtdConfig> util = new ExcelUtil<TMtdConfig>(TMtdConfig.class);
+        return util.exportExcel(list, "dailyMeetingConfig");
+    }
+
+    /**
+     * 获取调度会议配置详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        TMtdConfig tMtdConfig = tMtdConfigService.selectTMtdConfigById(id);
+        if (tMtdConfig.getConfigType() == 0) {
+            String[] arr = tMtdConfig.getConfigValue().split(",");
+            List<SysDictData> dictList = new ArrayList<>();
+            for (int i = 0; i < arr.length; i++) {
+                SysDictData dict = new SysDictData();
+                dict.setDictLabel(arr[i]);
+                dict.setDictValue(arr[i]);
+                dict.setDictType(tMtdConfig.getConfigKey());
+                dictList.add(dict);
+            }
+            tMtdConfig.setDictList(dictList);
+        }
+        if (tMtdConfig.getConfigType() == 1) {
+            String[] arr = tMtdConfig.getConfigValue().split(",");
+            List<SysDictData> dictList = new ArrayList<>();
+            for (int i = 0; i < arr.length; i++) {
+                SysUser sysUser =  userMapper.selectUserByStaffId(arr[i]);
+                SysDictData dict = new SysDictData();
+                dict.setDictLabel(sysUser.getNickName());
+                dict.setDictValue(sysUser.getStaffId());
+                dict.setDictType(tMtdConfig.getConfigKey());
+                dictList.add(dict);
+            }
+            tMtdConfig.setDictList(dictList);
+        }
+        return AjaxResult.success(tMtdConfig);
+    }
+
+    /**
+     * 新增调度会议配置
+     */
+    @Log(title = "调度会议配置", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TMtdConfig tMtdConfig)
+    {
+        return toAjax(tMtdConfigService.insertTMtdConfig(tMtdConfig));
+    }
+
+    /**
+     * 修改调度会议配置
+     */
+    @Log(title = "调度会议配置", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TMtdConfig tMtdConfig)
+    {
+        return toAjax(tMtdConfigService.updateTMtdConfig(tMtdConfig));
+    }
+
+    /**
+     * 删除调度会议配置
+     */
+    @Log(title = "调度会议配置", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(tMtdConfigService.deleteTMtdConfigByIds(ids));
+    }
+}

+ 205 - 0
master/src/main/java/com/ruoyi/project/plant/controller/TMtdDailyController.java

@@ -0,0 +1,205 @@
+package com.ruoyi.project.plant.controller;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+import com.alibaba.fastjson.JSON;
+import com.ruoyi.common.sendEmail.IMailService;
+import com.ruoyi.framework.config.RuoYiConfig;
+import com.ruoyi.project.plant.domain.TMtdItem;
+import com.ruoyi.project.plant.mapper.TMtdItemMapper;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+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.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.project.plant.domain.TMtdDaily;
+import com.ruoyi.project.plant.service.ITMtdDailyService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.page.TableDataInfo;
+
+import javax.annotation.Resource;
+
+/**
+ * 调度会议Controller
+ *
+ * @author ssy
+ * @date 2023-11-14
+ */
+@RestController
+@RequestMapping("/plant/dailyMeeting")
+public class TMtdDailyController extends BaseController
+{
+    @Autowired
+    private ITMtdDailyService tMtdDailyService;
+    @Resource
+    private TMtdItemMapper tMtdItemMapper;
+    @Autowired
+    private IMailService mailService;
+    //系统基础配置
+    @Autowired
+    private RuoYiConfig ruoyiConfig;
+    /**
+     * 查询调度会议列表
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TMtdDaily tMtdDaily)
+    {
+        startPage();
+        List<TMtdDaily> list = tMtdDailyService.selectTMtdDailyList(tMtdDaily);
+        return getDataTable(list);
+    }
+
+
+
+    /**
+     * 导出调度会议列表
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:export')")
+    @Log(title = "调度会议", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(TMtdDaily tMtdDaily)
+    {
+        List<TMtdDaily> list = tMtdDailyService.selectTMtdDailyList(tMtdDaily);
+        ExcelUtil<TMtdDaily> util = new ExcelUtil<TMtdDaily>(TMtdDaily.class);
+        return util.exportExcel(list, "dailyMeeting");
+    }
+
+    /**
+     * 获取调度会议详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+
+        TMtdDaily tMtdDaily = tMtdDailyService.selectTMtdDailyById(id);
+        //获取item列表
+        TMtdItem item = new TMtdItem();
+        item.setDailyId(id);
+        item.setItemType(0);
+        List<TMtdItem> item0 = tMtdItemMapper.selectTMtdItemList(item);
+        tMtdDaily.setItems0(item0);
+
+        item.setItemType(1);
+        List<TMtdItem> item1 = tMtdItemMapper.selectTMtdItemList(item);
+        tMtdDaily.setItems1(item1);
+
+        item.setItemType(2);
+        List<TMtdItem> item2 = tMtdItemMapper.selectTMtdItemList(item);
+        tMtdDaily.setItems2(item2);
+
+        item.setItemType(3);
+        List<TMtdItem> item3 = tMtdItemMapper.selectTMtdItemList(item);
+        tMtdDaily.setItems3(item3);
+
+        item.setItemType(4);
+        List<TMtdItem> item4 = tMtdItemMapper.selectTMtdItemList(item);
+        tMtdDaily.setItems4(item4);
+
+        item.setItemType(5);
+        List<TMtdItem> item5 = tMtdItemMapper.selectTMtdItemList(item);
+        tMtdDaily.setItems5(item5);
+
+        return AjaxResult.success(tMtdDaily);
+    }
+
+    /**
+     * 新增调度会议
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:add')")
+    @Log(title = "调度会议", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TMtdDaily tMtdDaily)
+    {
+        logger.info(JSON.toJSONString(tMtdDaily));
+        return toAjax(tMtdDailyService.insertTMtdDaily(tMtdDaily));
+    }
+
+    /**
+     * 修改调度会议
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:edit')")
+    @Log(title = "调度会议", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TMtdDaily tMtdDaily)
+    {
+        logger.info(JSON.toJSONString(tMtdDaily));
+        return toAjax(tMtdDailyService.updateTMtdDaily(tMtdDaily));
+    }
+
+    /**
+     * 删除调度会议
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:remove')")
+    @Log(title = "调度会议", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(tMtdDailyService.deleteTMtdDailyByIds(ids));
+    }
+
+    /**
+     * 查询调度会议列表
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:edit')")
+    @Log(title = "发送调度会议邮件", businessType = BusinessType.OTHER)
+    @GetMapping("/sendMail")
+    public AjaxResult sendMail(TMtdDaily tMtdDaily)
+    {
+        TMtdDaily daily = tMtdDailyService.selectTMtdDailyById(tMtdDaily.getId());
+
+        //写html开始内容
+        String start = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title></title></head><body><div style=\"background-color:#ECECEC; padding: 35px;\">" +
+                "<table cellpadding=\"0\" align=\"center\"" +
+                "style=\"width: 600px; margin: 0px auto; text-align: left; position: relative; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; font-size: 14px; font-family:微软雅黑, 黑体; line-height: 1.5; box-shadow: rgb(153, 153, 153) 0px 0px 5px; border-collapse: collapse; background-position: initial initial; background-repeat: initial initial;background:#fff;\">" +
+                "<tbody><tr><th valign=\"middle\" style=\"height: 25px; line-height: 25px; padding: 15px 35px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #42a3d3; background-color: #49bcff; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;\">" +
+                "<font face=\"微软雅黑\" size=\"5\" style=\"color: rgb(255, 255, 255); \">化工装置管理系统 </font><font face=\"微软雅黑\" size=\"3\" style=\"color: rgb(255, 255, 255); \">Chemical Plant Management System(CPMS)</font></th></tr>";
+        //写html结尾内容
+        String end = "</tbody></table></div></body></html>";
+        String username = "";
+        String[] email = {"735032128@qq.com", "1213269375@qq.com"};
+        String[] emailCc = {"ly@seashoreept.com", "ly735032128@gmail.com"};
+//        email = "735032128@qq.com";
+        //表html中间内容
+        String prime = "";
+        String firstcenter = "<tr><td><div style=\"padding:25px 35px 40px; background-color:#fff;\"><h2 style=\"margin: 5px 0px; \">" +
+                "<font color=\"#333333\" style=\"line-height: 20px; \"><font style=\"line-height: 22px; \" size=\"4\">" +
+                "亲爱的 用户</font><br><font style=\"line-height: 22px; \" size=\"4\">" +
+                "<p>您有一条新的调度会议:<br>" +
+                "会议日期:<b>meetingDate</b><br>" +
+                "请前往<a href=\"requestJumpPath/plant/meeting/detail/dailyId\">会议详情</a>查看。<br>" +
+                "<p align=\"right\">date</p>" +
+                "<div style=\"width:700px;margin:0 auto;\">" +
+                "<div style=\"padding:10px 10px 0;border-top:1px solid #ccc;color:#747474;margin-bottom:20px;line-height:1.3em;font-size:12px;\">" +
+                "<p>此为系统邮件,请勿回复<br>This e-Mail is an automatic reminder sent by CPMS, please do not reply</p>" +
+                "</div></div></div></td></tr>";
+
+        String pattern = "yyyy年MM月dd日"; // 定义日期格式化模板
+
+        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); // 创建日期格式化器
+
+        String formattedDate = dateFormat.format(daily.getMeetingDate()); // 将日期转换为字符串
+
+        String one = firstcenter.replaceFirst("meetingDate", formattedDate);
+        String two = one.replace("requestJumpPath", this.ruoyiConfig.getRequestJumpPath());
+        String three = two.replace("dailyId", daily.getId().toString());
+        String result = three.replaceFirst("date",  dateFormat.format(new Date()));
+        prime = prime + result;
+        //拼接html
+        String html = start + prime + end;
+        mailService.sendHtmlMail(email, "CPMS:您有一条"+ formattedDate+"装置调度会议信息", html, emailCc);
+        return AjaxResult.success();
+    }
+}

+ 103 - 0
master/src/main/java/com/ruoyi/project/plant/controller/TMtdItemController.java

@@ -0,0 +1,103 @@
+package com.ruoyi.project.plant.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+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.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.project.plant.domain.TMtdItem;
+import com.ruoyi.project.plant.service.ITMtdItemService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.page.TableDataInfo;
+
+/**
+ * 调度会议详情Controller
+ *
+ * @author ssy
+ * @date 2023-11-15
+ */
+@RestController
+@RequestMapping("/plant/dailyMeetingitem")
+public class TMtdItemController extends BaseController
+{
+    @Autowired
+    private ITMtdItemService tMtdItemService;
+
+    /**
+     * 查询调度会议详情列表
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeetingitem:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TMtdItem tMtdItem)
+    {
+        startPage();
+        List<TMtdItem> list = tMtdItemService.selectTMtdItemList(tMtdItem);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出调度会议详情列表
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeetingitem:export')")
+    @Log(title = "调度会议详情", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(TMtdItem tMtdItem)
+    {
+        List<TMtdItem> list = tMtdItemService.selectTMtdItemList(tMtdItem);
+        ExcelUtil<TMtdItem> util = new ExcelUtil<TMtdItem>(TMtdItem.class);
+        return util.exportExcel(list, "dailyMeetingitem");
+    }
+
+    /**
+     * 获取调度会议详情详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeetingitem:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(tMtdItemService.selectTMtdItemById(id));
+    }
+
+    /**
+     * 新增调度会议详情
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeetingitem:add')")
+    @Log(title = "调度会议详情", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TMtdItem tMtdItem)
+    {
+        return toAjax(tMtdItemService.insertTMtdItem(tMtdItem));
+    }
+
+    /**
+     * 修改调度会议详情
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeetingitem:edit')")
+    @Log(title = "调度会议详情", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TMtdItem tMtdItem)
+    {
+        return toAjax(tMtdItemService.updateTMtdItem(tMtdItem));
+    }
+
+    /**
+     * 删除调度会议详情
+     */
+    @PreAuthorize("@ss.hasPermi('plant:dailyMeetingitem:remove')")
+    @Log(title = "调度会议详情", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(tMtdItemService.deleteTMtdItemByIds(ids));
+    }
+}

+ 26 - 3
master/src/main/java/com/ruoyi/project/plant/controller/TStaffmgrController.java

@@ -366,7 +366,7 @@ public class TStaffmgrController extends BaseController
 
     //学历统计
     @GetMapping("/eduData")
-    public List<DataEntity> eduData(BaseEntity param)
+    public List<DataEntity> eduData(TStaffmgr param)
     {
         List<DataEntity> list = tStaffmgrMapper.selectEduData(param);
         List<SysDictData> education = iSysDictTypeService.selectDictDataByType("EDUCATION");
@@ -387,9 +387,32 @@ public class TStaffmgrController extends BaseController
         return list;
     }
 
+    //年龄统计
+    @GetMapping("/ageData")
+    public List<DataEntity> ageData(TStaffmgr param)
+    {
+        List<DataEntity> list = tStaffmgrMapper.selectAgeData(param);
+        List<SysDictData> education = iSysDictTypeService.selectDictDataByType("EDUCATION");
+        for (DataEntity d: list
+        ) {
+            for (SysDictData s: education
+            ) {
+                if (StringUtils.isBlank(d.getDataName())){
+                    d.setDataName("未知");
+                    break;
+                }
+                if (s.getDictValue().equals(d.getDataName())){
+                    d.setDataName(s.getDictLabel());
+                    break;
+                }
+            }
+        }
+        return list;
+    }
+
     //英语统计
     @GetMapping("/engData")
-    public List<DataEntity> engData(BaseEntity param)
+    public List<DataEntity> engData(TStaffmgr param)
     {
         List<DataEntity> list = tStaffmgrMapper.selectEngData(param);
         List<SysDictData> englishability = iSysDictTypeService.selectDictDataByType("ENGLISHABILITY");
@@ -412,7 +435,7 @@ public class TStaffmgrController extends BaseController
 
     //班值统计
     @GetMapping("/teamData")
-    public List<DataEntity> teamData(BaseEntity param)
+    public List<DataEntity> teamData(TStaffmgr param)
     {
         List<DataEntity> list = tStaffmgrMapper.selectTeamData(param);
         List<SysDictData> englishability = iSysDictTypeService.selectDictDataByType("TEAM_DIVIDE");

+ 115 - 0
master/src/main/java/com/ruoyi/project/plant/domain/TMtdConfig.java

@@ -0,0 +1,115 @@
+package com.ruoyi.project.plant.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.ruoyi.framework.web.domain.BaseEntity;
+import com.ruoyi.project.system.domain.SysDictData;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 调度会议配置对象 t_mtd_config
+ *
+ * @author ssy
+ * @date 2023-11-16
+ */
+public class TMtdConfig extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 参数名称 */
+    @Excel(name = "参数名称")
+    private String configName;
+
+    /** 参数键名 */
+    @Excel(name = "参数键名")
+    private String configKey;
+
+    /** 参数键值 */
+    @Excel(name = "参数键值")
+    private String configValue;
+
+    /** 参数类型 */
+    @Excel(name = "参数类型")
+    private Long configType;
+
+    /** 参数 */
+    @TableField(exist = false)
+    private List<SysDictData> dictList;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setConfigName(String configName)
+    {
+        this.configName = configName;
+    }
+
+    public String getConfigName()
+    {
+        return configName;
+    }
+    public void setConfigKey(String configKey)
+    {
+        this.configKey = configKey;
+    }
+
+    public String getConfigKey()
+    {
+        return configKey;
+    }
+    public void setConfigValue(String configValue)
+    {
+        this.configValue = configValue;
+    }
+
+    public String getConfigValue()
+    {
+        return configValue;
+    }
+    public void setConfigType(Long configType)
+    {
+        this.configType = configType;
+    }
+
+    public Long getConfigType()
+    {
+        return configType;
+    }
+
+    public List<SysDictData> getDictList() {
+        return dictList;
+    }
+
+    public void setDictList(List<SysDictData> dictList) {
+        this.dictList = dictList;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("configName", getConfigName())
+            .append("configKey", getConfigKey())
+            .append("configValue", getConfigValue())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .append("configType", getConfigType())
+            .toString();
+    }
+}

+ 419 - 0
master/src/main/java/com/ruoyi/project/plant/domain/TMtdDaily.java

@@ -0,0 +1,419 @@
+package com.ruoyi.project.plant.domain;
+
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.ruoyi.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 调度会议对象 t_mtd_daily
+ *
+ * @author ssy
+ * @date 2023-11-14
+ */
+public class TMtdDaily extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 记录人 */
+    @Excel(name = "记录人")
+    private String recorder;
+
+    /** 记录人 */
+    @Excel(name = "记录人姓名")
+    private String recorderName;
+
+    /** 会议编号 */
+    @Excel(name = "会议编号")
+    private String meetingNo;
+
+    /** 会议时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    @Excel(name = "会议时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date meetingDate;
+
+    /** 会议地点 */
+    @Excel(name = "会议地点")
+    private String venue;
+
+    /** 主题 */
+    @Excel(name = "主题")
+    private String subject;
+
+    /** Cracker */
+    @Excel(name = "Cracker")
+    private String attendCracker;
+
+    /** CTM */
+    @Excel(name = "CTM")
+    private String attendCtm;
+
+    /** CTA */
+    @Excel(name = "CTA")
+    private String attendCta;
+
+    /** LAB */
+    @Excel(name = "LAB")
+    private String attendLab;
+
+    /** 安全主题 */
+    @Excel(name = "安全主题")
+    private String safetyTopic;
+
+    /** 删除 */
+    private Long delFlag;
+
+    /** 创建人 */
+    private String createrCode;
+
+    /** 创建时间 */
+    private Date createdate;
+
+    /** 更新人 */
+    private String updaterCode;
+
+    /** 更新日期 */
+    private Date updatedate;
+
+    /** 所属部门 */
+    @Excel(name = "所属部门")
+    private Long deptId;
+
+
+    /** 运行模式 */
+
+    @Excel(name = "运行模式")
+
+    private String optMode;
+
+
+
+    /** 运行明细 */
+
+    @Excel(name = "运行明细")
+
+    private String optItem;
+
+
+
+    /** 裂解 */
+
+    @Excel(name = "裂解")
+
+    private String split;
+
+
+
+    /** pgu */
+
+    @Excel(name = "pgu")
+
+    private String pgu;
+
+
+
+    /** aeu */
+
+    @Excel(name = "aeu")
+
+    private String aeu;
+
+
+    private String deptName;
+
+    private List<TMtdItem> items0;
+
+    private List<TMtdItem> items1;
+    private List<TMtdItem> items2;
+    private List<TMtdItem> items3;
+    private List<TMtdItem> items4;
+    private List<TMtdItem> items5;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setRecorder(String recorder)
+    {
+        this.recorder = recorder;
+    }
+
+    public String getRecorderName() {
+        return recorderName;
+    }
+
+    public void setRecorderName(String recorderName) {
+        this.recorderName = recorderName;
+    }
+
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    public String getRecorder()
+    {
+        return recorder;
+    }
+    public void setMeetingNo(String meetingNo)
+    {
+        this.meetingNo = meetingNo;
+    }
+
+    public String getMeetingNo()
+    {
+        return meetingNo;
+    }
+    public void setMeetingDate(Date meetingDate)
+    {
+        this.meetingDate = meetingDate;
+    }
+
+    public Date getMeetingDate()
+    {
+        return meetingDate;
+    }
+    public void setVenue(String venue)
+    {
+        this.venue = venue;
+    }
+
+    public String getVenue()
+    {
+        return venue;
+    }
+    public void setSubject(String subject)
+    {
+        this.subject = subject;
+    }
+
+    public String getSubject()
+    {
+        return subject;
+    }
+    public void setAttendCracker(String attendCracker)
+    {
+        this.attendCracker = attendCracker;
+    }
+
+    public String getAttendCracker()
+    {
+        return attendCracker;
+    }
+    public void setAttendCtm(String attendCtm)
+    {
+        this.attendCtm = attendCtm;
+    }
+
+    public String getAttendCtm()
+    {
+        return attendCtm;
+    }
+    public void setAttendCta(String attendCta)
+    {
+        this.attendCta = attendCta;
+    }
+
+    public String getAttendCta()
+    {
+        return attendCta;
+    }
+    public void setAttendLab(String attendLab)
+    {
+        this.attendLab = attendLab;
+    }
+
+    public String getAttendLab()
+    {
+        return attendLab;
+    }
+    public void setSafetyTopic(String safetyTopic)
+    {
+        this.safetyTopic = safetyTopic;
+    }
+
+    public String getSafetyTopic()
+    {
+        return safetyTopic;
+    }
+    public void setDelFlag(Long delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public Long getDelFlag()
+    {
+        return delFlag;
+    }
+    public void setCreaterCode(String createrCode)
+    {
+        this.createrCode = createrCode;
+    }
+
+    public String getCreaterCode()
+    {
+        return createrCode;
+    }
+    public void setCreatedate(Date createdate)
+    {
+        this.createdate = createdate;
+    }
+
+    public Date getCreatedate()
+    {
+        return createdate;
+    }
+    public void setUpdaterCode(String updaterCode)
+    {
+        this.updaterCode = updaterCode;
+    }
+
+    public String getUpdaterCode()
+    {
+        return updaterCode;
+    }
+    public void setUpdatedate(Date updatedate)
+    {
+        this.updatedate = updatedate;
+    }
+
+    public Date getUpdatedate()
+    {
+        return updatedate;
+    }
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+
+    public List<TMtdItem> getItems0() {
+        return items0;
+    }
+
+    public void setItems0(List<TMtdItem> items0) {
+        this.items0 = items0;
+    }
+
+    public List<TMtdItem> getItems1() {
+        return items1;
+    }
+
+    public void setItems1(List<TMtdItem> items1) {
+        this.items1 = items1;
+    }
+
+    public List<TMtdItem> getItems2() {
+        return items2;
+    }
+
+    public void setItems2(List<TMtdItem> items2) {
+        this.items2 = items2;
+    }
+
+    public List<TMtdItem> getItems3() {
+        return items3;
+    }
+
+    public void setItems3(List<TMtdItem> items3) {
+        this.items3 = items3;
+    }
+
+    public List<TMtdItem> getItems4() {
+        return items4;
+    }
+
+    public void setItems4(List<TMtdItem> items4) {
+        this.items4 = items4;
+    }
+
+    public List<TMtdItem> getItems5() {
+        return items5;
+    }
+
+    public void setItems5(List<TMtdItem> items5) {
+        this.items5 = items5;
+    }
+
+    public String getOptMode() {
+        return optMode;
+    }
+
+    public void setOptMode(String optMode) {
+        this.optMode = optMode;
+    }
+
+    public String getOptItem() {
+        return optItem;
+    }
+
+    public void setOptItem(String optItem) {
+        this.optItem = optItem;
+    }
+
+    public String getSplit() {
+        return split;
+    }
+
+    public void setSplit(String split) {
+        this.split = split;
+    }
+
+    public String getPgu() {
+        return pgu;
+    }
+
+    public void setPgu(String pgu) {
+        this.pgu = pgu;
+    }
+
+    public String getAeu() {
+        return aeu;
+    }
+
+    public void setAeu(String aeu) {
+        this.aeu = aeu;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("recorder", getRecorder())
+            .append("meetingNo", getMeetingNo())
+            .append("meetingDate", getMeetingDate())
+            .append("venue", getVenue())
+            .append("subject", getSubject())
+            .append("attendCracker", getAttendCracker())
+            .append("attendCtm", getAttendCtm())
+            .append("attendCta", getAttendCta())
+            .append("attendLab", getAttendLab())
+            .append("safetyTopic", getSafetyTopic())
+            .append("delFlag", getDelFlag())
+            .append("createrCode", getCreaterCode())
+            .append("createdate", getCreatedate())
+            .append("updaterCode", getUpdaterCode())
+            .append("updatedate", getUpdatedate())
+            .append("deptId", getDeptId())
+            .toString();
+    }
+}

+ 190 - 0
master/src/main/java/com/ruoyi/project/plant/domain/TMtdItem.java

@@ -0,0 +1,190 @@
+package com.ruoyi.project.plant.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.ruoyi.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 调度会议详情对象 t_mtd_item
+ *
+ * @author ssy
+ * @date 2023-11-15
+ */
+public class TMtdItem extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** daily_id */
+    @Excel(name = "daily_id")
+    private Long dailyId;
+
+    /** item */
+    @Excel(name = "item")
+    private String item;
+
+    private Integer itemType;
+
+    /** 描述 */
+    @Excel(name = "描述")
+    private String description;
+
+    /** 执行人 */
+    @Excel(name = "执行人")
+    private String actionby;
+
+    /** 删除 */
+    private Long delFlag;
+
+    /** 创建人 */
+    @Excel(name = "创建人")
+    private String createrCode;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date createdate;
+
+    /** 更新人 */
+    @Excel(name = "更新人")
+    private String updaterCode;
+
+    /** 更新日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    @Excel(name = "更新日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date updatedate;
+
+    /** 所属部门 */
+    @Excel(name = "所属部门")
+    private Long deptId;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setDailyId(Long dailyId)
+    {
+        this.dailyId = dailyId;
+    }
+
+    public Long getDailyId()
+    {
+        return dailyId;
+    }
+    public void setItem(String item)
+    {
+        this.item = item;
+    }
+
+    public String getItem()
+    {
+        return item;
+    }
+    public void setDescription(String description)
+    {
+        this.description = description;
+    }
+
+    public String getDescription()
+    {
+        return description;
+    }
+    public void setActionby(String actionby)
+    {
+        this.actionby = actionby;
+    }
+
+    public String getActionby()
+    {
+        return actionby;
+    }
+    public void setDelFlag(Long delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public Long getDelFlag()
+    {
+        return delFlag;
+    }
+    public void setCreaterCode(String createrCode)
+    {
+        this.createrCode = createrCode;
+    }
+
+    public String getCreaterCode()
+    {
+        return createrCode;
+    }
+    public void setCreatedate(Date createdate)
+    {
+        this.createdate = createdate;
+    }
+
+    public Date getCreatedate()
+    {
+        return createdate;
+    }
+    public void setUpdaterCode(String updaterCode)
+    {
+        this.updaterCode = updaterCode;
+    }
+
+    public String getUpdaterCode()
+    {
+        return updaterCode;
+    }
+    public void setUpdatedate(Date updatedate)
+    {
+        this.updatedate = updatedate;
+    }
+
+    public Date getUpdatedate()
+    {
+        return updatedate;
+    }
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+
+    public Integer getItemType() {
+        return itemType;
+    }
+
+    public void setItemType(Integer itemType) {
+        this.itemType = itemType;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("dailyId", getDailyId())
+            .append("item", getItem())
+            .append("description", getDescription())
+            .append("actionby", getActionby())
+            .append("delFlag", getDelFlag())
+            .append("createrCode", getCreaterCode())
+            .append("createdate", getCreatedate())
+            .append("updaterCode", getUpdaterCode())
+            .append("updatedate", getUpdatedate())
+            .append("deptId", getDeptId())
+            .toString();
+    }
+}

+ 63 - 0
master/src/main/java/com/ruoyi/project/plant/mapper/TMtdConfigMapper.java

@@ -0,0 +1,63 @@
+package com.ruoyi.project.plant.mapper;
+
+import java.util.List;
+import com.ruoyi.framework.aspectj.lang.annotation.DataScope;
+import com.ruoyi.project.plant.domain.TMtdConfig;
+
+/**
+ * 调度会议配置Mapper接口
+ *
+ * @author ssy
+ * @date 2023-11-16
+ */
+public interface TMtdConfigMapper
+{
+    /**
+     * 查询调度会议配置
+     *
+     * @param id 调度会议配置ID
+     * @return 调度会议配置
+     */
+    public TMtdConfig selectTMtdConfigById(Long id);
+
+    /**
+     * 查询调度会议配置列表
+     *
+     * @param tMtdConfig 调度会议配置
+     * @return 调度会议配置集合
+     */
+    @DataScope(deptAlias = "d")
+    public List<TMtdConfig> selectTMtdConfigList(TMtdConfig tMtdConfig);
+
+    /**
+     * 新增调度会议配置
+     *
+     * @param tMtdConfig 调度会议配置
+     * @return 结果
+     */
+    public int insertTMtdConfig(TMtdConfig tMtdConfig);
+
+    /**
+     * 修改调度会议配置
+     *
+     * @param tMtdConfig 调度会议配置
+     * @return 结果
+     */
+    public int updateTMtdConfig(TMtdConfig tMtdConfig);
+
+    /**
+     * 删除调度会议配置
+     *
+     * @param id 调度会议配置ID
+     * @return 结果
+     */
+    public int deleteTMtdConfigById(Long id);
+
+    /**
+     * 批量删除调度会议配置
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteTMtdConfigByIds(Long[] ids);
+}

+ 63 - 0
master/src/main/java/com/ruoyi/project/plant/mapper/TMtdDailyMapper.java

@@ -0,0 +1,63 @@
+package com.ruoyi.project.plant.mapper;
+
+import java.util.List;
+import com.ruoyi.framework.aspectj.lang.annotation.DataScope;
+import com.ruoyi.project.plant.domain.TMtdDaily;
+
+/**
+ * 调度会议Mapper接口
+ *
+ * @author ssy
+ * @date 2023-11-14
+ */
+public interface TMtdDailyMapper
+{
+    /**
+     * 查询调度会议
+     *
+     * @param id 调度会议ID
+     * @return 调度会议
+     */
+    public TMtdDaily selectTMtdDailyById(Long id);
+
+    /**
+     * 查询调度会议列表
+     *
+     * @param tMtdDaily 调度会议
+     * @return 调度会议集合
+     */
+    @DataScope(deptAlias = "d")
+    public List<TMtdDaily> selectTMtdDailyList(TMtdDaily tMtdDaily);
+
+    /**
+     * 新增调度会议
+     *
+     * @param tMtdDaily 调度会议
+     * @return 结果
+     */
+    public int insertTMtdDaily(TMtdDaily tMtdDaily);
+
+    /**
+     * 修改调度会议
+     *
+     * @param tMtdDaily 调度会议
+     * @return 结果
+     */
+    public int updateTMtdDaily(TMtdDaily tMtdDaily);
+
+    /**
+     * 删除调度会议
+     *
+     * @param id 调度会议ID
+     * @return 结果
+     */
+    public int deleteTMtdDailyById(Long id);
+
+    /**
+     * 批量删除调度会议
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteTMtdDailyByIds(Long[] ids);
+}

+ 65 - 0
master/src/main/java/com/ruoyi/project/plant/mapper/TMtdItemMapper.java

@@ -0,0 +1,65 @@
+package com.ruoyi.project.plant.mapper;
+
+import java.util.List;
+import com.ruoyi.framework.aspectj.lang.annotation.DataScope;
+import com.ruoyi.project.plant.domain.TMtdItem;
+
+/**
+ * 调度会议详情Mapper接口
+ *
+ * @author ssy
+ * @date 2023-11-15
+ */
+public interface TMtdItemMapper
+{
+    /**
+     * 查询调度会议详情
+     *
+     * @param id 调度会议详情ID
+     * @return 调度会议详情
+     */
+    public TMtdItem selectTMtdItemById(Long id);
+
+    /**
+     * 查询调度会议详情列表
+     *
+     * @param tMtdItem 调度会议详情
+     * @return 调度会议详情集合
+     */
+    @DataScope(deptAlias = "d")
+    public List<TMtdItem> selectTMtdItemList(TMtdItem tMtdItem);
+
+    /**
+     * 新增调度会议详情
+     *
+     * @param tMtdItem 调度会议详情
+     * @return 结果
+     */
+    public int insertTMtdItem(TMtdItem tMtdItem);
+
+    /**
+     * 修改调度会议详情
+     *
+     * @param tMtdItem 调度会议详情
+     * @return 结果
+     */
+    public int updateTMtdItem(TMtdItem tMtdItem);
+
+    /**
+     * 删除调度会议详情
+     *
+     * @param id 调度会议详情ID
+     * @return 结果
+     */
+    public int deleteTMtdItemById(Long id);
+
+    /**
+     * 批量删除调度会议详情
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteTMtdItemByIds(Long[] ids);
+
+    void deleteTMtdItemByDailyId(Long id);
+}

+ 8 - 3
master/src/main/java/com/ruoyi/project/plant/mapper/TStaffmgrMapper.java

@@ -125,13 +125,16 @@ public interface TStaffmgrMapper
     public int deleteTStaffmgrByIds(Long[] ids);
 
     @DataScope(deptAlias = "d")
-    List<DataEntity> selectEduData(BaseEntity param);
+    List<DataEntity> selectEduData(TStaffmgr param);
 
     @DataScope(deptAlias = "d")
-    List<DataEntity> selectEngData(BaseEntity param);
+    List<DataEntity> selectEngData(TStaffmgr param);
 
     @DataScope(deptAlias = "d")
-    List<DataEntity> selectTeamData(BaseEntity param);
+    List<DataEntity> selectTeamData(TStaffmgr param);
+
+    @DataScope(deptAlias = "d")
+    List<DataEntity> selectAgeData(TStaffmgr param);
 
     @DataScope(deptAlias = "d")
     List<TStaffmgr> selectLeftTStaffmgrList(TStaffmgr tStaffmgr);
@@ -147,4 +150,6 @@ public interface TStaffmgrMapper
     List<Map<String,Object>> selectUserInfoByStaffmgr(TStaffmgr tStaffmgr);
 
     int deleteRetireTStaffmgrByIds(Long id);
+
+
 }

+ 61 - 0
master/src/main/java/com/ruoyi/project/plant/service/ITMtdConfigService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.project.plant.service;
+
+import java.util.List;
+import com.ruoyi.project.plant.domain.TMtdConfig;
+
+/**
+ * 调度会议配置Service接口
+ *
+ * @author ssy
+ * @date 2023-11-16
+ */
+public interface ITMtdConfigService
+{
+    /**
+     * 查询调度会议配置
+     *
+     * @param id 调度会议配置ID
+     * @return 调度会议配置
+     */
+    public TMtdConfig selectTMtdConfigById(Long id);
+
+    /**
+     * 查询调度会议配置列表
+     *
+     * @param tMtdConfig 调度会议配置
+     * @return 调度会议配置集合
+     */
+    public List<TMtdConfig> selectTMtdConfigList(TMtdConfig tMtdConfig);
+
+    /**
+     * 新增调度会议配置
+     *
+     * @param tMtdConfig 调度会议配置
+     * @return 结果
+     */
+    public int insertTMtdConfig(TMtdConfig tMtdConfig);
+
+    /**
+     * 修改调度会议配置
+     *
+     * @param tMtdConfig 调度会议配置
+     * @return 结果
+     */
+    public int updateTMtdConfig(TMtdConfig tMtdConfig);
+
+    /**
+     * 批量删除调度会议配置
+     *
+     * @param ids 需要删除的调度会议配置ID
+     * @return 结果
+     */
+    public int deleteTMtdConfigByIds(Long[] ids);
+
+    /**
+     * 删除调度会议配置信息
+     *
+     * @param id 调度会议配置ID
+     * @return 结果
+     */
+    public int deleteTMtdConfigById(Long id);
+}

+ 61 - 0
master/src/main/java/com/ruoyi/project/plant/service/ITMtdDailyService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.project.plant.service;
+
+import java.util.List;
+import com.ruoyi.project.plant.domain.TMtdDaily;
+
+/**
+ * 调度会议Service接口
+ *
+ * @author ssy
+ * @date 2023-11-14
+ */
+public interface ITMtdDailyService
+{
+    /**
+     * 查询调度会议
+     *
+     * @param id 调度会议ID
+     * @return 调度会议
+     */
+    public TMtdDaily selectTMtdDailyById(Long id);
+
+    /**
+     * 查询调度会议列表
+     *
+     * @param tMtdDaily 调度会议
+     * @return 调度会议集合
+     */
+    public List<TMtdDaily> selectTMtdDailyList(TMtdDaily tMtdDaily);
+
+    /**
+     * 新增调度会议
+     *
+     * @param tMtdDaily 调度会议
+     * @return 结果
+     */
+    public int insertTMtdDaily(TMtdDaily tMtdDaily);
+
+    /**
+     * 修改调度会议
+     *
+     * @param tMtdDaily 调度会议
+     * @return 结果
+     */
+    public int updateTMtdDaily(TMtdDaily tMtdDaily);
+
+    /**
+     * 批量删除调度会议
+     *
+     * @param ids 需要删除的调度会议ID
+     * @return 结果
+     */
+    public int deleteTMtdDailyByIds(Long[] ids);
+
+    /**
+     * 删除调度会议信息
+     *
+     * @param id 调度会议ID
+     * @return 结果
+     */
+    public int deleteTMtdDailyById(Long id);
+}

+ 61 - 0
master/src/main/java/com/ruoyi/project/plant/service/ITMtdItemService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.project.plant.service;
+
+import java.util.List;
+import com.ruoyi.project.plant.domain.TMtdItem;
+
+/**
+ * 调度会议详情Service接口
+ *
+ * @author ssy
+ * @date 2023-11-15
+ */
+public interface ITMtdItemService
+{
+    /**
+     * 查询调度会议详情
+     *
+     * @param id 调度会议详情ID
+     * @return 调度会议详情
+     */
+    public TMtdItem selectTMtdItemById(Long id);
+
+    /**
+     * 查询调度会议详情列表
+     *
+     * @param tMtdItem 调度会议详情
+     * @return 调度会议详情集合
+     */
+    public List<TMtdItem> selectTMtdItemList(TMtdItem tMtdItem);
+
+    /**
+     * 新增调度会议详情
+     *
+     * @param tMtdItem 调度会议详情
+     * @return 结果
+     */
+    public int insertTMtdItem(TMtdItem tMtdItem);
+
+    /**
+     * 修改调度会议详情
+     *
+     * @param tMtdItem 调度会议详情
+     * @return 结果
+     */
+    public int updateTMtdItem(TMtdItem tMtdItem);
+
+    /**
+     * 批量删除调度会议详情
+     *
+     * @param ids 需要删除的调度会议详情ID
+     * @return 结果
+     */
+    public int deleteTMtdItemByIds(Long[] ids);
+
+    /**
+     * 删除调度会议详情信息
+     *
+     * @param id 调度会议详情ID
+     * @return 结果
+     */
+    public int deleteTMtdItemById(Long id);
+}

+ 96 - 0
master/src/main/java/com/ruoyi/project/plant/service/impl/TMtdConfigServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ruoyi.project.plant.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.project.plant.mapper.TMtdConfigMapper;
+import com.ruoyi.project.plant.domain.TMtdConfig;
+import com.ruoyi.project.plant.service.ITMtdConfigService;
+
+/**
+ * 调度会议配置Service业务层处理
+ *
+ * @author ssy
+ * @date 2023-11-16
+ */
+@Service
+public class TMtdConfigServiceImpl implements ITMtdConfigService
+{
+    @Autowired
+    private TMtdConfigMapper tMtdConfigMapper;
+
+    /**
+     * 查询调度会议配置
+     *
+     * @param id 调度会议配置ID
+     * @return 调度会议配置
+     */
+    @Override
+    public TMtdConfig selectTMtdConfigById(Long id)
+    {
+        return tMtdConfigMapper.selectTMtdConfigById(id);
+    }
+
+    /**
+     * 查询调度会议配置列表
+     *
+     * @param tMtdConfig 调度会议配置
+     * @return 调度会议配置
+     */
+    @Override
+    public List<TMtdConfig> selectTMtdConfigList(TMtdConfig tMtdConfig)
+    {
+        return tMtdConfigMapper.selectTMtdConfigList(tMtdConfig);
+    }
+
+    /**
+     * 新增调度会议配置
+     *
+     * @param tMtdConfig 调度会议配置
+     * @return 结果
+     */
+    @Override
+    public int insertTMtdConfig(TMtdConfig tMtdConfig)
+    {
+        tMtdConfig.setCreateTime(DateUtils.getNowDate());
+        return tMtdConfigMapper.insertTMtdConfig(tMtdConfig);
+    }
+
+    /**
+     * 修改调度会议配置
+     *
+     * @param tMtdConfig 调度会议配置
+     * @return 结果
+     */
+    @Override
+    public int updateTMtdConfig(TMtdConfig tMtdConfig)
+    {
+        tMtdConfig.setUpdateTime(DateUtils.getNowDate());
+        return tMtdConfigMapper.updateTMtdConfig(tMtdConfig);
+    }
+
+    /**
+     * 批量删除调度会议配置
+     *
+     * @param ids 需要删除的调度会议配置ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTMtdConfigByIds(Long[] ids)
+    {
+        return tMtdConfigMapper.deleteTMtdConfigByIds(ids);
+    }
+
+    /**
+     * 删除调度会议配置信息
+     *
+     * @param id 调度会议配置ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTMtdConfigById(Long id)
+    {
+        return tMtdConfigMapper.deleteTMtdConfigById(id);
+    }
+}

+ 167 - 0
master/src/main/java/com/ruoyi/project/plant/service/impl/TMtdDailyServiceImpl.java

@@ -0,0 +1,167 @@
+package com.ruoyi.project.plant.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.project.plant.domain.TMtdItem;
+import com.ruoyi.project.plant.mapper.TMtdItemMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.project.plant.mapper.TMtdDailyMapper;
+import com.ruoyi.project.plant.domain.TMtdDaily;
+import com.ruoyi.project.plant.service.ITMtdDailyService;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+/**
+ * 调度会议Service业务层处理
+ *
+ * @author ssy
+ * @date 2023-11-14
+ */
+@Service
+public class TMtdDailyServiceImpl implements ITMtdDailyService
+{
+    @Resource
+    private TMtdDailyMapper tMtdDailyMapper;
+    @Resource
+    private TMtdItemMapper tMtdItemMapper;
+
+    /**
+     * 查询调度会议
+     *
+     * @param id 调度会议ID
+     * @return 调度会议
+     */
+    @Override
+    public TMtdDaily selectTMtdDailyById(Long id)
+    {
+        return tMtdDailyMapper.selectTMtdDailyById(id);
+    }
+
+    /**
+     * 查询调度会议列表
+     *
+     * @param tMtdDaily 调度会议
+     * @return 调度会议
+     */
+    @Override
+    public List<TMtdDaily> selectTMtdDailyList(TMtdDaily tMtdDaily)
+    {
+        return tMtdDailyMapper.selectTMtdDailyList(tMtdDaily);
+    }
+
+    /**
+     * 新增调度会议
+     *
+     * @param tMtdDaily 调度会议
+     * @return 结果
+     */
+    @Override
+    public int insertTMtdDaily(TMtdDaily tMtdDaily)
+    {
+        tMtdDailyMapper.insertTMtdDaily(tMtdDaily);
+        insertItem(tMtdDaily);
+        return 1;
+    }
+
+    /**
+     * 修改调度会议
+     *
+     * @param tMtdDaily 调度会议
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int updateTMtdDaily(TMtdDaily tMtdDaily)
+    {
+        tMtdDailyMapper.updateTMtdDaily(tMtdDaily);
+        tMtdItemMapper.deleteTMtdItemByDailyId(tMtdDaily.getId());
+        insertItem(tMtdDaily);
+
+        return tMtdDailyMapper.updateTMtdDaily(tMtdDaily);
+    }
+
+    private void insertItem(TMtdDaily tMtdDaily) {
+        List<TMtdItem> items0 = tMtdDaily.getItems0();
+        if (items0 != null) {
+
+        }
+
+        List<TMtdItem> items1 = tMtdDaily.getItems1();
+        if (items1 != null) {
+            for (TMtdItem t: items1
+            ) {
+                t.setItemType(1);
+                t.setDailyId(tMtdDaily.getId());
+                tMtdItemMapper.insertTMtdItem(t);
+            }
+        }
+
+        List<TMtdItem> items2 = tMtdDaily.getItems2();
+        if (items2 != null) {
+            for (TMtdItem t: items2
+            ) {
+                t.setItemType(2);
+                t.setDailyId(tMtdDaily.getId());
+                tMtdItemMapper.insertTMtdItem(t);
+            }
+        }
+
+
+        List<TMtdItem> items3 = tMtdDaily.getItems3();
+        if (items3 != null) {
+            for (TMtdItem t: items3
+            ) {
+                t.setItemType(3);
+                t.setDailyId(tMtdDaily.getId());
+                tMtdItemMapper.insertTMtdItem(t);
+            }
+        }
+
+        List<TMtdItem> items4 = tMtdDaily.getItems4();
+        if (items4 != null) {
+            for (TMtdItem t: items4
+            ) {
+                t.setItemType(4);
+                t.setDailyId(tMtdDaily.getId());
+                tMtdItemMapper.insertTMtdItem(t);
+            }
+        }
+
+        List<TMtdItem> items5 = tMtdDaily.getItems5();
+        if (items5 != null) {
+            for (TMtdItem t: items5
+            ) {
+                t.setItemType(5);
+                t.setDailyId(tMtdDaily.getId());
+                tMtdItemMapper.insertTMtdItem(t);
+            }
+        }
+
+    }
+
+    /**
+     * 批量删除调度会议
+     *
+     * @param ids 需要删除的调度会议ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTMtdDailyByIds(Long[] ids)
+    {
+        return tMtdDailyMapper.deleteTMtdDailyByIds(ids);
+    }
+
+    /**
+     * 删除调度会议信息
+     *
+     * @param id 调度会议ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTMtdDailyById(Long id)
+    {
+        return tMtdDailyMapper.deleteTMtdDailyById(id);
+    }
+}

+ 95 - 0
master/src/main/java/com/ruoyi/project/plant/service/impl/TMtdItemServiceImpl.java

@@ -0,0 +1,95 @@
+package com.ruoyi.project.plant.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.project.plant.mapper.TMtdItemMapper;
+import com.ruoyi.project.plant.domain.TMtdItem;
+import com.ruoyi.project.plant.service.ITMtdItemService;
+
+import javax.annotation.Resource;
+
+/**
+ * 调度会议详情Service业务层处理
+ *
+ * @author ssy
+ * @date 2023-11-15
+ */
+@Service
+public class TMtdItemServiceImpl implements ITMtdItemService
+{
+    @Resource
+    private TMtdItemMapper tMtdItemMapper;
+
+    /**
+     * 查询调度会议详情
+     *
+     * @param id 调度会议详情ID
+     * @return 调度会议详情
+     */
+    @Override
+    public TMtdItem selectTMtdItemById(Long id)
+    {
+        return tMtdItemMapper.selectTMtdItemById(id);
+    }
+
+    /**
+     * 查询调度会议详情列表
+     *
+     * @param tMtdItem 调度会议详情
+     * @return 调度会议详情
+     */
+    @Override
+    public List<TMtdItem> selectTMtdItemList(TMtdItem tMtdItem)
+    {
+        return tMtdItemMapper.selectTMtdItemList(tMtdItem);
+    }
+
+    /**
+     * 新增调度会议详情
+     *
+     * @param tMtdItem 调度会议详情
+     * @return 结果
+     */
+    @Override
+    public int insertTMtdItem(TMtdItem tMtdItem)
+    {
+        return tMtdItemMapper.insertTMtdItem(tMtdItem);
+    }
+
+    /**
+     * 修改调度会议详情
+     *
+     * @param tMtdItem 调度会议详情
+     * @return 结果
+     */
+    @Override
+    public int updateTMtdItem(TMtdItem tMtdItem)
+    {
+        return tMtdItemMapper.updateTMtdItem(tMtdItem);
+    }
+
+    /**
+     * 批量删除调度会议详情
+     *
+     * @param ids 需要删除的调度会议详情ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTMtdItemByIds(Long[] ids)
+    {
+        return tMtdItemMapper.deleteTMtdItemByIds(ids);
+    }
+
+    /**
+     * 删除调度会议详情信息
+     *
+     * @param id 调度会议详情ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTMtdItemById(Long id)
+    {
+        return tMtdItemMapper.deleteTMtdItemById(id);
+    }
+}

+ 18 - 2
master/src/main/java/com/ruoyi/project/training/controller/TTrainingDeviceController.java

@@ -70,7 +70,7 @@ public class TTrainingDeviceController extends BaseController
     {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
-
+        SimpleDateFormat sdf2 = new SimpleDateFormat("MM");
         List<TTrainingDevice> list = tTrainingDeviceService.selectTTrainingDeviceList(tTrainingDevice);
 
         TTraining tTraining = new TTraining();
@@ -152,7 +152,23 @@ public class TTrainingDeviceController extends BaseController
                     }else if (d.getSupplementary().equals("0")){
                         device.add("╳");
                         if (tTrainings.get(i).getRegularId() != null&&d.getStartDate() != null) {
-                            deviceDate.add(sdf1.format(d.getStartDate()));
+                            //判断结束日期和开始日期是否同一个月
+                            if (tTrainings.get(i).getCourseEnddate()!= null) {
+                                Calendar calendar1 = Calendar.getInstance();
+                                calendar1.setTime(d.getStartDate());
+                                int month1 = calendar1.get(Calendar.MONTH);
+
+                                Calendar calendar2 = Calendar.getInstance();
+                                calendar2.setTime(tTrainings.get(i).getCourseEnddate());
+                                int month2 = calendar2.get(Calendar.MONTH);
+                                if (month2 == month1) {
+                                    deviceDate.add(sdf1.format(d.getStartDate()));
+                                }else {
+                                    deviceDate.add(sdf1.format(d.getStartDate()) + "/" + sdf2.format(tTrainings.get(i).getCourseEnddate()));
+                                }
+                            }else {
+                                deviceDate.add(sdf1.format(d.getStartDate()));
+                            }
                         }else {
                             if(d.getStartDate() != null){
                                 deviceDate.add(sdf.format(d.getStartDate()));

+ 2 - 2
master/src/main/java/com/ruoyi/project/training/newstaff/controller/TTnNewController.java

@@ -99,6 +99,7 @@ public class TTnNewController extends BaseController
                         TTnTransferplan tTnTransferplan = new TTnTransferplan();
                         List<TTnTransferplan> transferplanAll = tTnTransferplanMapper.selectTTnTransferplanListByNewId(tTnTransferplan);
                         tTnTransferplan.setPlanStatus(1l);
+                        tTnTransferplan.setNewId(t.getNewId());
                         List<TTnTransferplan> transferplanNow = tTnTransferplanMapper.selectTTnTransferplanListByNewId(tTnTransferplan);
                         secAll = transferplanAll.size();
                         secNow= transferplanNow.size();
@@ -125,8 +126,7 @@ public class TTnNewController extends BaseController
     }
 
     @GetMapping("/trainNewstaffCount")
-    public AjaxResult trainNewstaffCount() {
-        TTnNew tTnNew = new TTnNew();
+    public AjaxResult trainNewstaffCount(TTnNew tTnNew) {
         tTnNew.setPlanStatus(1l);
         List<TTnNew> list1 = tTnNewService.selectTTnNewList(tTnNew);
         tTnNew.setPlanStatus(0l);

+ 4 - 4
master/src/main/resources/application.yml

@@ -9,9 +9,9 @@ ruoyi:
   # 实例演示开关
   demoEnabled: true
   # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /u03/cpmsfile/uploadPath)
-  profile: D:/ruoyi/uploadPath
-  # 邮件中链接跳转路径 示例(本地:http://localhost/#,服务器:http://47.114.101.16:8080/cpms/index.html#)
-  requestJumpPath: https://cpms.basf-ypc.net.cn/cpms/index.html#
+  profile: /u03/cpmsfile/uploadPath
+  # 邮件中链接跳转路径 示例(本地:http://localhost/cpms/index.html#,服务器:http://47.114.101.16:8080/cpms/index.html# https://cpms.basf-ypc.net.cn/cpms/index.html#)
+  requestJumpPath: http://localhost/cpms/index.html#
   # 获取ip地址开关
   addressEnabled: false
   # 验证码类型 math 数组计算 char 字符验证
@@ -193,7 +193,7 @@ gen:
   # 作者
   author: ssy
   # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
-  packageName: com.ruoyi.project.ehs # 自动去除表前缀,默认是true
+  packageName: com.ruoyi.project.plant # 自动去除表前缀,默认是true
   autoRemovePre: false
   # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
   tablePrefix: sys_

+ 99 - 0
master/src/main/resources/mybatis/plant/TMtdConfigMapper.xml

@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.project.plant.mapper.TMtdConfigMapper">
+
+    <resultMap type="TMtdConfig" id="TMtdConfigResult">
+        <result property="id"    column="id"    />
+        <result property="configName"    column="config_name"    />
+        <result property="configKey"    column="config_key"    />
+        <result property="configValue"    column="config_value"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+        <result property="configType"    column="config_type"    />
+    </resultMap>
+
+    <sql id="selectTMtdConfigVo">
+        select d.id, d.config_name, d.config_key, d.config_value, d.create_by, d.create_time, d.update_by, d.update_time, d.remark, d.config_type from t_mtd_config d
+    </sql>
+
+    <select id="selectTMtdConfigList" parameterType="TMtdConfig" resultMap="TMtdConfigResult">
+        <include refid="selectTMtdConfigVo"/>
+        <where>
+            <if test="configName != null  and configName != ''"> and config_name like concat(concat('%', #{configName}), '%')</if>
+            <if test="configKey != null  and configKey != ''"> and config_key = #{configKey}</if>
+            <if test="configValue != null  and configValue != ''"> and config_value = #{configValue}</if>
+            and d.del_flag = 0
+        </where>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+    </select>
+
+    <select id="selectTMtdConfigById" parameterType="Long" resultMap="TMtdConfigResult">
+        <include refid="selectTMtdConfigVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertTMtdConfig" parameterType="TMtdConfig">
+        <selectKey keyProperty="id" resultType="long" order="BEFORE">
+            SELECT seq_t_mtd_config.NEXTVAL as id FROM DUAL
+        </selectKey>
+        insert into t_mtd_config
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="configName != null">config_name,</if>
+            <if test="configKey != null">config_key,</if>
+            <if test="configValue != null">config_value,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+            <if test="configType != null">config_type,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="configName != null">#{configName},</if>
+            <if test="configKey != null">#{configKey},</if>
+            <if test="configValue != null">#{configValue},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="configType != null">#{configType},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTMtdConfig" parameterType="TMtdConfig">
+        update t_mtd_config
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="configName != null">config_name = #{configName},</if>
+            <if test="configKey != null">config_key = #{configKey},</if>
+            <if test="configValue != null">config_value = #{configValue},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="configType != null">config_type = #{configType},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteTMtdConfigById" parameterType="Long">
+        update t_mtd_config set del_flag = 2 where id = #{id}
+    </update>
+
+    <update id="deleteTMtdConfigByIds" parameterType="String">
+        update t_mtd_config set del_flag = 2 where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+</mapper>

+ 160 - 0
master/src/main/resources/mybatis/plant/TMtdDailyMapper.xml

@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.project.plant.mapper.TMtdDailyMapper">
+
+    <resultMap type="TMtdDaily" id="TMtdDailyResult">
+        <result property="id"    column="id"    />
+        <result property="recorder"    column="recorder"    />
+        <result property="meetingNo"    column="meeting_no"    />
+        <result property="meetingDate"    column="meeting_date"    />
+        <result property="venue"    column="venue"    />
+        <result property="subject"    column="subject"    />
+        <result property="attendCracker"    column="attend_cracker"    />
+        <result property="attendCtm"    column="attend_ctm"    />
+        <result property="attendCta"    column="attend_cta"    />
+        <result property="attendLab"    column="attend_lab"    />
+        <result property="safetyTopic"    column="safety_topic"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createrCode"    column="creater_code"    />
+        <result property="createdate"    column="createdate"    />
+        <result property="updaterCode"    column="updater_code"    />
+        <result property="updatedate"    column="updatedate"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="deptName" column="dept_name" />
+        <result property="optMode"    column="opt_mode"    />
+        <result property="optItem"    column="opt_item"    />
+        <result property="split"    column="split"    />
+        <result property="pgu"    column="pgu"    />
+        <result property="aeu"    column="aeu"    />
+
+    </resultMap>
+
+    <sql id="selectTMtdDailyVo">
+        select d.id, d.recorder,su.nick_name as recorderName, d.meeting_no, d.meeting_date, d.venue, d.subject, d.attend_cracker, d.attend_ctm, d.attend_cta, d.attend_lab, d.safety_topic, d.del_flag, d.creater_code, d.createdate, d.updater_code, d.updatedate, d.dept_id , d.opt_mode, d.opt_item, d.split, d.pgu, d.aeu ,s.dept_name from t_mtd_daily d
+      left join sys_dept s on s.dept_id = d.dept_id
+      left join sys_user su on su.staffid = d.recorder and su.del_flag = 0
+    </sql>
+
+    <select id="selectTMtdDailyList" parameterType="TMtdDaily" resultMap="TMtdDailyResult">
+        <include refid="selectTMtdDailyVo"/>
+        <where>
+            <if test="recorder != null  and recorder != ''"> and recorder = #{recorder}</if>
+            <if test="meetingNo != null  and meetingNo != ''"> and meeting_no = #{meetingNo}</if>
+            <if test="meetingDate != null "> and meeting_date = #{meetingDate}</if>
+            <if test="venue != null  and venue != ''"> and venue = #{venue}</if>
+            <if test="subject != null  and subject != ''"> and subject = #{subject}</if>
+            <if test="attendCracker != null  and attendCracker != ''"> and attend_cracker = #{attendCracker}</if>
+            <if test="attendCtm != null  and attendCtm != ''"> and attend_ctm = #{attendCtm}</if>
+            <if test="attendCta != null  and attendCta != ''"> and attend_cta = #{attendCta}</if>
+            <if test="attendLab != null  and attendLab != ''"> and attend_lab = #{attendLab}</if>
+            <if test="safetyTopic != null  and safetyTopic != ''"> and safety_topic = #{safetyTopic}</if>
+            <if test="deptId != null "> and dept_id = #{deptId}</if>
+            and d.del_flag = 0
+        </where>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+        order by d.meeting_date desc
+    </select>
+
+    <select id="selectTMtdDailyById" parameterType="Long" resultMap="TMtdDailyResult">
+        <include refid="selectTMtdDailyVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertTMtdDaily" parameterType="TMtdDaily">
+        <selectKey keyProperty="id" resultType="long" order="BEFORE">
+            SELECT seq_t_mtd_daily.NEXTVAL as id FROM DUAL
+        </selectKey>
+        insert into t_mtd_daily
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="recorder != null">recorder,</if>
+            <if test="meetingNo != null">meeting_no,</if>
+            <if test="meetingDate != null">meeting_date,</if>
+            <if test="venue != null">venue,</if>
+            <if test="subject != null">subject,</if>
+            <if test="attendCracker != null">attend_cracker,</if>
+            <if test="attendCtm != null">attend_ctm,</if>
+            <if test="attendCta != null">attend_cta,</if>
+            <if test="attendLab != null">attend_lab,</if>
+            <if test="safetyTopic != null">safety_topic,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createrCode != null">creater_code,</if>
+            <if test="createdate != null">createdate,</if>
+            <if test="updaterCode != null">updater_code,</if>
+            <if test="updatedate != null">updatedate,</if>
+            <if test="deptId != null">dept_id,</if>
+            <if test="optMode != null">opt_mode,</if>
+            <if test="optItem != null">opt_item,</if>
+            <if test="split != null">split,</if>
+            <if test="pgu != null">pgu,</if>
+            <if test="aeu != null">aeu,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="recorder != null">#{recorder},</if>
+            <if test="meetingNo != null">#{meetingNo},</if>
+            <if test="meetingDate != null">#{meetingDate},</if>
+            <if test="venue != null">#{venue},</if>
+            <if test="subject != null">#{subject},</if>
+            <if test="attendCracker != null">#{attendCracker},</if>
+            <if test="attendCtm != null">#{attendCtm},</if>
+            <if test="attendCta != null">#{attendCta},</if>
+            <if test="attendLab != null">#{attendLab},</if>
+            <if test="safetyTopic != null">#{safetyTopic},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createrCode != null">#{createrCode},</if>
+            <if test="createdate != null">#{createdate},</if>
+            <if test="updaterCode != null">#{updaterCode},</if>
+            <if test="updatedate != null">#{updatedate},</if>
+            <if test="deptId != null">#{deptId},</if>
+            <if test="optMode != null">#{optMode},</if>
+            <if test="optItem != null">#{optItem},</if>
+            <if test="split != null">#{split},</if>
+            <if test="pgu != null">#{pgu},</if>
+            <if test="aeu != null">#{aeu},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTMtdDaily" parameterType="TMtdDaily">
+        update t_mtd_daily
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="recorder != null">recorder = #{recorder},</if>
+            <if test="meetingNo != null">meeting_no = #{meetingNo},</if>
+            <if test="meetingDate != null">meeting_date = #{meetingDate},</if>
+            <if test="venue != null">venue = #{venue},</if>
+            <if test="subject != null">subject = #{subject},</if>
+            <if test="attendCracker != null">attend_cracker = #{attendCracker},</if>
+            <if test="attendCtm != null">attend_ctm = #{attendCtm},</if>
+            <if test="attendCta != null">attend_cta = #{attendCta},</if>
+            <if test="attendLab != null">attend_lab = #{attendLab},</if>
+            <if test="safetyTopic != null">safety_topic = #{safetyTopic},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createrCode != null">creater_code = #{createrCode},</if>
+            <if test="createdate != null">createdate = #{createdate},</if>
+            <if test="updaterCode != null">updater_code = #{updaterCode},</if>
+            <if test="updatedate != null">updatedate = #{updatedate},</if>
+            <if test="deptId != null">dept_id = #{deptId},</if>
+            <if test="optMode != null">opt_mode = #{optMode},</if>
+            <if test="optItem != null">opt_item = #{optItem},</if>
+            <if test="split != null">split = #{split},</if>
+            <if test="pgu != null">pgu = #{pgu},</if>
+            <if test="aeu != null">aeu = #{aeu},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteTMtdDailyById" parameterType="Long">
+        update t_mtd_daily set del_flag = 2 where id = #{id}
+    </update>
+
+    <update id="deleteTMtdDailyByIds" parameterType="String">
+        update t_mtd_daily set del_flag = 2 where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+</mapper>

+ 122 - 0
master/src/main/resources/mybatis/plant/TMtdItemMapper.xml

@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.project.plant.mapper.TMtdItemMapper">
+
+    <resultMap type="TMtdItem" id="TMtdItemResult">
+        <result property="id"    column="id"    />
+        <result property="dailyId"    column="daily_id"    />
+        <result property="item"    column="item"    />
+        <result property="itemType"    column="item_type"    />
+        <result property="description"    column="description"    />
+        <result property="actionby"    column="actionby"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createrCode"    column="creater_code"    />
+        <result property="createdate"    column="createdate"    />
+        <result property="updaterCode"    column="updater_code"    />
+        <result property="updatedate"    column="updatedate"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="deptName" column="dept_name" />
+    </resultMap>
+
+    <sql id="selectTMtdItemVo">
+        select d.id, d.daily_id, d.item, d.description, d.actionby, d.del_flag, d.creater_code, d.createdate, d.updater_code, d.updatedate, d.dept_id ,s.dept_name from t_mtd_item d
+      left join sys_dept s on s.dept_id = d.dept_id
+    </sql>
+
+    <select id="selectTMtdItemList" parameterType="TMtdItem" resultMap="TMtdItemResult">
+        <include refid="selectTMtdItemVo"/>
+        <where>
+            <if test="dailyId != null "> and daily_id = #{dailyId}</if>
+            <if test="item != null  and item != ''"> and item = #{item}</if>
+            <if test="description != null  and description != ''"> and description = #{description}</if>
+            <if test="actionby != null  and actionby != ''"> and actionby = #{actionby}</if>
+            <if test="createrCode != null  and createrCode != ''"> and creater_code = #{createrCode}</if>
+            <if test="createdate != null "> and createdate = #{createdate}</if>
+            <if test="updaterCode != null  and updaterCode != ''"> and updater_code = #{updaterCode}</if>
+            <if test="updatedate != null "> and updatedate = #{updatedate}</if>
+            <if test="deptId != null "> and dept_id = #{deptId}</if>
+            <if test="itemType != null "> and item_type = #{itemType}</if>
+            and d.del_flag = 0
+        </where>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+    </select>
+
+    <select id="selectTMtdItemById" parameterType="Long" resultMap="TMtdItemResult">
+        <include refid="selectTMtdItemVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertTMtdItem" parameterType="TMtdItem">
+        <selectKey keyProperty="id" resultType="long" order="BEFORE">
+            SELECT seq_t_mtd_item.NEXTVAL as id FROM DUAL
+        </selectKey>
+        insert into t_mtd_item
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="dailyId != null">daily_id,</if>
+            <if test="item != null">item,</if>
+            <if test="description != null">description,</if>
+            <if test="actionby != null">actionby,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createrCode != null">creater_code,</if>
+            <if test="createdate != null">createdate,</if>
+            <if test="updaterCode != null">updater_code,</if>
+            <if test="updatedate != null">updatedate,</if>
+            <if test="deptId != null">dept_id,</if>
+            <if test="itemType != null">item_type,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="dailyId != null">#{dailyId},</if>
+            <if test="item != null">#{item},</if>
+            <if test="description != null">#{description},</if>
+            <if test="actionby != null">#{actionby},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createrCode != null">#{createrCode},</if>
+            <if test="createdate != null">#{createdate},</if>
+            <if test="updaterCode != null">#{updaterCode},</if>
+            <if test="updatedate != null">#{updatedate},</if>
+            <if test="deptId != null">#{deptId},</if>
+            <if test="itemType != null">#{itemType},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTMtdItem" parameterType="TMtdItem">
+        update t_mtd_item
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="dailyId != null">daily_id = #{dailyId},</if>
+            <if test="item != null">item = #{item},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="actionby != null">actionby = #{actionby},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createrCode != null">creater_code = #{createrCode},</if>
+            <if test="createdate != null">createdate = #{createdate},</if>
+            <if test="updaterCode != null">updater_code = #{updaterCode},</if>
+            <if test="updatedate != null">updatedate = #{updatedate},</if>
+            <if test="deptId != null">dept_id = #{deptId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteTMtdItemById" parameterType="Long">
+        update t_mtd_item set del_flag = 2 where id = #{id}
+    </update>
+
+
+    <update id="deleteTMtdItemByIds" parameterType="String">
+        update t_mtd_item set del_flag = 2 where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+    <delete id="deleteTMtdItemByDailyId" parameterType="Long">
+        delete from t_mtd_item where daily_id = #{dailyId}
+    </delete>
+
+
+
+</mapper>

+ 249 - 21
master/src/main/resources/mybatis/plant/TStaffmgrMapper.xml

@@ -445,13 +445,61 @@
     <select id="selectEduData" resultType="com.ruoyi.project.common.domain.DataEntity">
             SELECT count(1) as dataNum,d.EDUCATION as dataName FROM "T_STAFFMGR" d
         <where>
-<!--            <if test="name != null  and name != ''"> and name like concat(concat('%', #{name}), '%')</if>-->
-<!--            <if test="sex != null  and sex != ''"> and sex = #{sex}</if>-->
-<!--            <if test="unit != null  and unit != ''"> and unit = #{unit}</if>-->
-<!--            <if test="team != null  and team != ''"> and team = #{team}</if>-->
-<!--            <if test="actualpost != null  and actualpost != ''"> and actualpost = #{actualpost}</if>-->
-<!--            <if test="education != null  and education != ''"> and education = #{education}</if>-->
-<!--            <if test="enAbility != null  and enAbility != ''"> and en_ability = #{enAbility}</if>-->
+            <if test="name != null  and name != ''"> and name like concat(concat('%', #{name}), '%')</if>
+            <if test="sex != null  and sex != ''"> and sex = #{sex}</if>
+            <if test="unit != null  and unit != ''"> and unit = #{unit}</if>
+            <if test="specialDuty != null  and specialDuty != ''"> and special_duty like concat(concat('%', #{specialDuty}), '%')</if>
+            <if test="units != null  and units != ''">
+                and
+                unit in
+                <foreach collection="units.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="team != null  and team != ''"> and team = #{team}</if>
+            <if test="teams != null  and teams != ''">
+                and
+                team in
+                <foreach collection="teams.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="actualpost != null  and actualpost != ''"> and actualpost = #{actualpost}</if>
+            <if test="actualposts != null  and actualposts != ''">
+                and
+                actualpost in
+                <foreach collection="actualposts.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+
+            </if>
+            <if test="education != null  and education != ''"> and education = #{education}</if>
+            <if test="educations != null  and educations != ''">
+                and
+                education in
+                <foreach collection="educations.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="enAbility != null  and enAbility != ''"> and en_ability = #{enAbility}</if>
+            <if test="enAbilitys != null  and enAbilitys != ''">
+                and
+                en_ability in
+                <foreach collection="enAbilitys.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="haveEmail != null  and haveEmail != ''"> and mail IS NOT NULL</if>
+            <if test="skillevaluation != null"> and team = 10
+                or team = 12
+                or team = 14
+                or team = 16
+            </if>
             and d.del_flag = 0
         </where>
         <!-- 数据范围过滤 -->
@@ -463,13 +511,61 @@
     <select id="selectEngData" resultType="com.ruoyi.project.common.domain.DataEntity">
         SELECT count(1) as dataNum,d.en_ability as dataName FROM "T_STAFFMGR" d
         <where>
-<!--            <if test="name != null  and name != ''"> and name like concat(concat('%', #{name}), '%')</if>-->
-<!--            <if test="sex != null  and sex != ''"> and sex = #{sex}</if>-->
-<!--            <if test="unit != null  and unit != ''"> and unit = #{unit}</if>-->
-<!--            <if test="team != null  and team != ''"> and team = #{team}</if>-->
-<!--            <if test="actualpost != null  and actualpost != ''"> and actualpost = #{actualpost}</if>-->
-<!--            <if test="education != null  and education != ''"> and education = #{education}</if>-->
-<!--            <if test="enAbility != null  and enAbility != ''"> and en_ability = #{enAbility}</if>-->
+            <if test="name != null  and name != ''"> and name like concat(concat('%', #{name}), '%')</if>
+            <if test="sex != null  and sex != ''"> and sex = #{sex}</if>
+            <if test="unit != null  and unit != ''"> and unit = #{unit}</if>
+            <if test="specialDuty != null  and specialDuty != ''"> and special_duty like concat(concat('%', #{specialDuty}), '%')</if>
+            <if test="units != null  and units != ''">
+                and
+                unit in
+                <foreach collection="units.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="team != null  and team != ''"> and team = #{team}</if>
+            <if test="teams != null  and teams != ''">
+                and
+                team in
+                <foreach collection="teams.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="actualpost != null  and actualpost != ''"> and actualpost = #{actualpost}</if>
+            <if test="actualposts != null  and actualposts != ''">
+                and
+                actualpost in
+                <foreach collection="actualposts.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+
+            </if>
+            <if test="education != null  and education != ''"> and education = #{education}</if>
+            <if test="educations != null  and educations != ''">
+                and
+                education in
+                <foreach collection="educations.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="enAbility != null  and enAbility != ''"> and en_ability = #{enAbility}</if>
+            <if test="enAbilitys != null  and enAbilitys != ''">
+                and
+                en_ability in
+                <foreach collection="enAbilitys.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="haveEmail != null  and haveEmail != ''"> and mail IS NOT NULL</if>
+            <if test="skillevaluation != null"> and team = 10
+                or team = 12
+                or team = 14
+                or team = 16
+            </if>
             and d.del_flag = 0
         </where>
         <!-- 数据范围过滤 -->
@@ -481,13 +577,61 @@
     <select id="selectTeamData" resultType="com.ruoyi.project.common.domain.DataEntity">
         SELECT count(1) as dataNum,d.team as dataName FROM "T_STAFFMGR" d
         <where>
-<!--            <if test="name != null  and name != ''"> and name like concat(concat('%', #{name}), '%')</if>-->
-<!--            <if test="sex != null  and sex != ''"> and sex = #{sex}</if>-->
-<!--            <if test="unit != null  and unit != ''"> and unit = #{unit}</if>-->
-<!--            <if test="team != null  and team != ''"> and team = #{team}</if>-->
-<!--            <if test="actualpost != null  and actualpost != ''"> and actualpost = #{actualpost}</if>-->
-<!--            <if test="education != null  and education != ''"> and education = #{education}</if>-->
-<!--            <if test="enAbility != null  and enAbility != ''"> and en_ability = #{enAbility}</if>-->
+            <if test="name != null  and name != ''"> and name like concat(concat('%', #{name}), '%')</if>
+            <if test="sex != null  and sex != ''"> and sex = #{sex}</if>
+            <if test="unit != null  and unit != ''"> and unit = #{unit}</if>
+            <if test="specialDuty != null  and specialDuty != ''"> and special_duty like concat(concat('%', #{specialDuty}), '%')</if>
+            <if test="units != null  and units != ''">
+                and
+                unit in
+                <foreach collection="units.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="team != null  and team != ''"> and team = #{team}</if>
+            <if test="teams != null  and teams != ''">
+                and
+                team in
+                <foreach collection="teams.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="actualpost != null  and actualpost != ''"> and actualpost = #{actualpost}</if>
+            <if test="actualposts != null  and actualposts != ''">
+                and
+                actualpost in
+                <foreach collection="actualposts.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+
+            </if>
+            <if test="education != null  and education != ''"> and education = #{education}</if>
+            <if test="educations != null  and educations != ''">
+                and
+                education in
+                <foreach collection="educations.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="enAbility != null  and enAbility != ''"> and en_ability = #{enAbility}</if>
+            <if test="enAbilitys != null  and enAbilitys != ''">
+                and
+                en_ability in
+                <foreach collection="enAbilitys.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="haveEmail != null  and haveEmail != ''"> and mail IS NOT NULL</if>
+            <if test="skillevaluation != null"> and team = 10
+                or team = 12
+                or team = 14
+                or team = 16
+            </if>
             and d.del_flag = 0
         </where>
         <!-- 数据范围过滤 -->
@@ -496,6 +640,90 @@
         order by dataName
     </select>
 
+    <select id="selectAgeData" resultType="com.ruoyi.project.common.domain.DataEntity">
+        SELECT
+        CASE
+        WHEN FLOOR((MONTHS_BETWEEN(SYSDATE, BIRTHDAY) / 12) / 10) * 10 <![CDATA[<]]> 20 THEN '20以下'
+        WHEN FLOOR((MONTHS_BETWEEN(SYSDATE, BIRTHDAY) / 12) / 10) * 10 >= 60 THEN '60以上'
+        ELSE TO_CHAR(FLOOR((MONTHS_BETWEEN(SYSDATE, BIRTHDAY) / 12) / 10) * 10) || '到' || TO_CHAR(FLOOR((MONTHS_BETWEEN(SYSDATE, BIRTHDAY) / 12) / 10) * 10 + 9)
+        END AS dataName,
+        COUNT(*) AS dataNum
+        FROM
+        T_STAFFMGR d
+        <where>
+            <if test="name != null  and name != ''"> and name like concat(concat('%', #{name}), '%')</if>
+            <if test="sex != null  and sex != ''"> and sex = #{sex}</if>
+            <if test="unit != null  and unit != ''"> and unit = #{unit}</if>
+            <if test="specialDuty != null  and specialDuty != ''"> and special_duty like concat(concat('%', #{specialDuty}), '%')</if>
+            <if test="units != null  and units != ''">
+                and
+                unit in
+                <foreach collection="units.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="team != null  and team != ''"> and team = #{team}</if>
+            <if test="teams != null  and teams != ''">
+                and
+                team in
+                <foreach collection="teams.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="actualpost != null  and actualpost != ''"> and actualpost = #{actualpost}</if>
+            <if test="actualposts != null  and actualposts != ''">
+                and
+                actualpost in
+                <foreach collection="actualposts.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+
+            </if>
+            <if test="education != null  and education != ''"> and education = #{education}</if>
+            <if test="educations != null  and educations != ''">
+                and
+                education in
+                <foreach collection="educations.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="enAbility != null  and enAbility != ''"> and en_ability = #{enAbility}</if>
+            <if test="enAbilitys != null  and enAbilitys != ''">
+                and
+                en_ability in
+                <foreach collection="enAbilitys.split(',')" item="item" index="index"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="haveEmail != null  and haveEmail != ''"> and mail IS NOT NULL</if>
+            <if test="skillevaluation != null"> and team = 10
+                or team = 12
+                or team = 14
+                or team = 16
+            </if>
+            and d.del_flag = 0
+        </where>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+        GROUP BY
+        CASE
+        WHEN BIRTHDAY IS NULL THEN '未知'
+        WHEN FLOOR((MONTHS_BETWEEN(SYSDATE, BIRTHDAY) / 12) / 10) * 10 <![CDATA[<]]> 20 THEN '20以下'
+        WHEN FLOOR((MONTHS_BETWEEN(SYSDATE, BIRTHDAY) / 12) / 10) * 10 >= 60 THEN '60以上'
+        ELSE TO_CHAR(FLOOR((MONTHS_BETWEEN(SYSDATE, BIRTHDAY) / 12) / 10) * 10) || '到' || TO_CHAR(FLOOR((MONTHS_BETWEEN(SYSDATE, BIRTHDAY) / 12) / 10) * 10 + 9)
+        END
+        ORDER BY
+        dataName
+
+    </select>
+
+
+
 
     <select id="selectTMentorStaffmgrByPost"  resultMap="TStaffmgrResult">
         <include refid="selectTStaffmgrVo"/>

+ 2 - 0
master/src/main/resources/mybatis/training/TTrainingMapper.xml

@@ -100,6 +100,8 @@
             <if test="endDate != null">and course_startdate <![CDATA[<=]]>#{endDate}</if>
             <if test=" nonParticipants!= null">and NON_PARTICIPANTS is not null</if>
             <if test=" isNon == 1">and NON_PARTICIPANTS is not null</if>
+            <if test=" isNon == 2">and isfinish = 1</if>
+            <if test=" isNon == 3">and isfinish = 0 and NON_PARTICIPANTS is null</if>
             and d.del_flag = 0
         </where>
         <!-- 数据范围过滤 -->

+ 1 - 0
master/src/main/resources/mybatis/training/newstaff/TTnNewMapper.xml

@@ -41,6 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="startdate != null "> and startdate = #{startdate}</if>
             <if test="enddate != null "> and enddate = #{enddate}</if>
             <if test="planType != null "> and plan_type = #{planType}</if>
+            <if test="planYear != null "> and TO_CHAR(startdate,'yyyy') = #{planYear}</if>
             and d.del_flag = 0
         </where>
         <!-- 数据范围过滤 -->

+ 2 - 1
ui/src/api/common/homedataCbpb.js

@@ -15,10 +15,11 @@ export function procedureCount() {
   })
 }
 // 统计培训
-export function trainCount() {
+export function trainCount(query) {
   return request({
     url: '/cbps/home/trainCount',
     method: 'get',
+    params: query
   })
 }
 // 根据时间统计

+ 62 - 0
ui/src/api/plant/dailyMeeting.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询调度会议列表
+export function listDailyMeeting(query) {
+  return request({
+    url: '/plant/dailyMeeting/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询调度会议列表
+export function sendMail(query) {
+  return request({
+    url: '/plant/dailyMeeting/sendMail',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询调度会议详细
+export function getDailyMeeting(id) {
+  return request({
+    url: '/plant/dailyMeeting/' + id,
+    method: 'get'
+  })
+}
+
+// 新增调度会议
+export function addDailyMeeting(data) {
+  return request({
+    url: '/plant/dailyMeeting',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改调度会议
+export function updateDailyMeeting(data) {
+  return request({
+    url: '/plant/dailyMeeting',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除调度会议
+export function delDailyMeeting(id) {
+  return request({
+    url: '/plant/dailyMeeting/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出调度会议
+export function exportDailyMeeting(query) {
+  return request({
+    url: '/plant/dailyMeeting/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
ui/src/api/plant/dailyMeetingConfig.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询调度会议配置列表
+export function listDailyMeetingConfig(query) {
+  return request({
+    url: '/plant/dailyMeetingConfig/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询调度会议配置详细
+export function getDailyMeetingConfig(id) {
+  return request({
+    url: '/plant/dailyMeetingConfig/' + id,
+    method: 'get'
+  })
+}
+
+// 新增调度会议配置
+export function addDailyMeetingConfig(data) {
+  return request({
+    url: '/plant/dailyMeetingConfig',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改调度会议配置
+export function updateDailyMeetingConfig(data) {
+  return request({
+    url: '/plant/dailyMeetingConfig',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除调度会议配置
+export function delDailyMeetingConfig(id) {
+  return request({
+    url: '/plant/dailyMeetingConfig/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出调度会议配置
+export function exportDailyMeetingConfig(query) {
+  return request({
+    url: '/plant/dailyMeetingConfig/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
ui/src/api/plant/dailyMeetingitem.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询调度会议详情列表
+export function listDailyMeetingitem(query) {
+  return request({
+    url: '/plant/dailyMeetingitem/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询调度会议详情详细
+export function getDailyMeetingitem(id) {
+  return request({
+    url: '/plant/dailyMeetingitem/' + id,
+    method: 'get'
+  })
+}
+
+// 新增调度会议详情
+export function addDailyMeetingitem(data) {
+  return request({
+    url: '/plant/dailyMeetingitem',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改调度会议详情
+export function updateDailyMeetingitem(data) {
+  return request({
+    url: '/plant/dailyMeetingitem',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除调度会议详情
+export function delDailyMeetingitem(id) {
+  return request({
+    url: '/plant/dailyMeetingitem/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出调度会议详情
+export function exportDailyMeetingitem(query) {
+  return request({
+    url: '/plant/dailyMeetingitem/export',
+    method: 'get',
+    params: query
+  })
+}

+ 9 - 0
ui/src/api/plant/staffmgr.js

@@ -135,6 +135,15 @@ export function engData(query) {
   })
 }
 
+// 年龄统计
+export function ageData(query) {
+  return request({
+    url: '/plant/staffmgr/ageData',
+    method: 'get',
+    params: query
+  })
+}
+
 // 英语统计
 export function teamData(query) {
   return request({

+ 2 - 1
ui/src/api/training/newstaff/tnNew.js

@@ -62,10 +62,11 @@ export function exportTnNew(query) {
 }
 
 // 统计培训
-export function trainNewstaffCount() {
+export function trainNewstaffCount(query) {
   return request({
     url: '/newstaff/tnNew/trainNewstaffCount',
     method: 'get',
+    params: query
   })
 }
 

+ 19 - 0
ui/src/router/index.js

@@ -207,6 +207,25 @@ export const constantRoutes = [
       }
     ]
   },
+  {
+    path: '/plant/meeting',
+    component: Layout,
+    hidden: true,
+    children: [
+      {
+        path: 'detail/:id(\\d+)',
+        component: (resolve) => require(['@/views/plant/dailyMeeting/detail'], resolve),
+        name: 'detail',
+        meta: { title: '调度会议详情' }
+      },
+      {
+        path: 'dailyMeetingConfig',
+        component: (resolve) => require(['@/views/plant/dailyMeetingConfig'], resolve),
+        name: 'dailyMeetingConfig',
+        meta: { title: '调度会议配置' }
+      }
+    ]
+  },
   {
     path: '/training/spec',
     component: Layout,

+ 11 - 0
ui/src/views/dashboard/hcq/BrithChart.vue

@@ -63,6 +63,17 @@ export default {
     this.chart = null
   },
   methods: {
+    changeYear(year){
+      let param = {planYear: year}
+      trainNewstaffCount(param).then(res=>{
+        this.dataOut = [
+          {value: res.data.count1, name: res.data.count1Name},
+          {value: res.data.count0, name: res.data.count0Name},
+        ]
+        this.total = res.data.count1 + res.data.count0
+        this.initChart()
+      })
+    },
     initChart() {
       this.chart.setOption({
         tooltip: {

+ 13 - 7
ui/src/views/dashboard/hcq/PieChart.vue

@@ -52,7 +52,6 @@ export default {
       //当前扇区的dataIndex
       index = param.name;
       //自己的操作,这里是点击跳转路由,并携带参数
-      if (index == '未参培') {
           /*跳转路由*/
           this.$router.push({
             path: '/training/tracking/training',
@@ -60,12 +59,6 @@ export default {
               status: index,
             }
           })
-      }else {
-        /*跳转路由*/
-        this.$router.push({
-          path: '/training/tracking/training',
-        })
-      }
     });
   },
   beforeDestroy() {
@@ -76,7 +69,20 @@ export default {
     this.chart = null
   },
   methods: {
+    changeYear(year){
+      let param = {year: year}
+        trainCount(param).then(res=>{
+          this.trainTotal = res.data.count1 + res.data.count0 + res.data.count2
+          this.dataOut = [
+            {value: res.data.count1, name: res.data.count1Name},
+            {value: res.data.count0, name: res.data.count0Name},
+            {value: res.data.count2, name: res.data.count2Name},
+          ]
+          this.initChart()
+        })
+    },
     initChart() {
+      console.log("----------")
       var total = this.trainTotal
       this.chart.setOption({
         title: [

+ 25 - 9
ui/src/views/hcqhome.vue

@@ -20,17 +20,19 @@
             <span class="card-name">装置年度培训完成情况</span>
             <el-dropdown style="float: right ;cursor: pointer" placement="bottom" trigger="click" class="card-time">
               <span class="el-dropdown-link">
-                年份 2023
+                年份 {{trainingYear}}
                 <i class="el-icon-date"></i>
               </span>
               <el-dropdown-menu slot="dropdown">
-              <el-dropdown-item @click.native="chooseYear(this.searchFormField.year)">{{this.searchFormField.year}}</el-dropdown-item>
-            </el-dropdown-menu>
+                <el-dropdown-item @click.native="chooseYear(-1)">{{this.searchFormField.year - 1}}</el-dropdown-item>
+                <el-dropdown-item @click.native="chooseYear(0)">{{this.searchFormField.year}}</el-dropdown-item>
+                <el-dropdown-item @click.native="chooseYear(1)">{{this.searchFormField.year + 1}}</el-dropdown-item>
+              </el-dropdown-menu>
             </el-dropdown>
           </div>
         </div>
         <div class="chart-wrapper">
-          <pie-chart />
+          <pie-chart ref="piechart" />
         </div>
       </el-col>
 <!--      <el-col :xs="24" :sm="24" :lg="8">-->
@@ -44,17 +46,18 @@
             <span class="card-name">{{ $t('新员工培训完成率') }}</span>
             <el-dropdown style="float: right ;cursor: pointer" placement="bottom" trigger="click" class="card-time">
               <span class="el-dropdown-link">
-                年份 2023
+                年份 {{trainingYearNew}}
                 <i class="el-icon-date"></i>
               </span>
               <el-dropdown-menu slot="dropdown">
-                <el-dropdown-item @click.native="chooseYear(this.searchFormField.year)">{{this.searchFormField.year}}</el-dropdown-item>
-              </el-dropdown-menu>
+                <el-dropdown-item @click.native="chooseYearNew(-1)">{{this.searchFormField.year - 1}}</el-dropdown-item>
+                <el-dropdown-item @click.native="chooseYearNew(0)">{{this.searchFormField.year}}</el-dropdown-item>
+                <el-dropdown-item @click.native="chooseYearNew(1)">{{this.searchFormField.year + 1}}</el-dropdown-item>              </el-dropdown-menu>
             </el-dropdown>
           </div>
         </div>
         <div class="chart-wrapper">
-          <birth-chart />
+          <birth-chart ref="newchart"/>
         </div>
       </el-col>
     </el-row>
@@ -128,10 +131,16 @@ export default {
       lineChartData: lineChartData.newVisitis,
       // 获取当前年份
       searchFormField: {
-        year: this.getNowTime(),
+        year: parseInt(this.getNowTime()),
       },
+      trainingYear: null,
+      trainingYearNew: null,
     }
   },
+  created() {
+    this.trainingYear = new Date().getFullYear();
+    this.trainingYearNew = new Date().getFullYear();
+  },
   methods: {
     /** 获取当前年份 */
     getNowTime() {
@@ -147,7 +156,14 @@ export default {
     },
     //变换年份
     chooseYear (index) {
+      console.log(index + "nian")
+      this.trainingYear = this.searchFormField.year + index
+      this.$refs.piechart.changeYear(this.searchFormField.year + index)
+    },
 
+    chooseYearNew (index) {
+      this.trainingYearNew = this.searchFormField.year + index
+      this.$refs.newchart.changeYear(this.searchFormField.year + index)
     }
   }
 }

+ 432 - 0
ui/src/views/plant/dailyMeeting/detail.vue

@@ -0,0 +1,432 @@
+<template>
+    <div>
+      <el-form label-width="100px">
+        <el-row class="meetingbg">
+          <el-col :span="12">
+            <el-form-item label="会议时间"><el-date-picker v-model="form.meetingDate"  type="date"
+                                                       value-format="yyyy-MM-dd" /></el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="会议地点"><el-select v-model="form.venue">
+              <el-option
+                v-for="dict in venueOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              ></el-option>
+
+            </el-select></el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="会议名称">裂解装置调度</el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="记录人"><el-select v-model="form.recorder">
+              <el-option
+                v-for="dict in recorderOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              ></el-option>
+
+            </el-select></el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="主题">Daily Production</el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="参会人">
+              <el-col :span="2">Cracker:</el-col>
+              <el-col :span="22">
+                <el-checkbox-group v-model="attendCrackerList">
+                  <el-checkbox v-for="dict in attendCrackerOptions" :label="dict.dictLabel"></el-checkbox>
+                </el-checkbox-group>
+              </el-col>
+              <el-col :span="2">CTM:</el-col>
+              <el-col :span="22">
+                <el-checkbox-group v-model="attendCtmList">
+                  <el-checkbox v-for="dict in attendCtmOptions" :label="dict.dictLabel"></el-checkbox>
+
+                </el-checkbox-group>
+              </el-col>
+              <el-col :span="2">CTA:</el-col>
+              <el-col :span="22">
+                <el-checkbox-group v-model="attendCtaList">
+                  <el-checkbox v-for="dict in attendCtaOptions" :label="dict.dictLabel"></el-checkbox>
+
+                </el-checkbox-group>
+              </el-col>
+              <el-col :span="2">LAB:</el-col>
+              <el-col :span="22">
+                <el-checkbox-group v-model="attendLabList">
+                  <el-checkbox v-for="dict in attendLabOptions" :label="dict.dictLabel"></el-checkbox>
+
+                </el-checkbox-group>
+              </el-col>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="Safety Topic">1、现场动火安全<br />2、环保注意事项</el-form-item>
+          </el-col>
+        </el-row>
+
+        <table class="color-table" width="100%" border="0" cellspacing="0">
+          <tr class="meetingbg">
+            <th>Item</th>
+            <th>Description</th>
+            <th>Action by</th>
+            <td></td>
+          </tr>
+          <!-- item1 -->
+          <tr class="yellowbg">
+            <td>1、</td>
+            <td>Production Activities</td>
+            <td></td>
+            <td></td>
+          </tr>
+          <tr class="yellowbg">
+            <td>1.1</td>
+            <td>裂解炉运行模式:<el-select v-model="form.optMode">
+              <el-option
+                v-for="dict in optModeOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              ></el-option>
+            </el-select>
+              <el-checkbox-group v-model="optItemList">
+                <el-checkbox v-for="dict in optItemOptions" :label="dict.dictLabel">
+
+                </el-checkbox>
+              </el-checkbox-group>
+            </td>
+            <td>ss</td>
+            <td></td>
+          </tr>
+          <tr class="yellowbg">
+            <td>1.2</td>
+            <td>负荷:裂解:<el-input v-model="form.split" style="width: 160px"></el-input>
+              PGU:<el-input v-model="form.pgu" style="width: 160px"></el-input>
+              AEU:<el-input v-model="form.aeu" style="width: 160px"></el-input>
+            </td>
+            <td>ss</td>
+            <td></td>
+          </tr>
+          <tr class="yellowbg" v-for="(item1, index) in form.items1" :key="'item1'+index">
+            <td>1.{{ 3 + index}}</td>
+            <td><el-input type="textarea" v-model="item1.description"></el-input></td>
+            <td><el-select v-model="item1.actionby">
+              <el-option
+                v-for="dict in actionOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              ></el-option>
+            </el-select></td>
+            <td><el-button type="text" @click="deleteItem(1, index)">移除</el-button></td>
+          </tr>
+          <tr class="yellowbg">
+            <td colspan="4" style="text-align: right"><el-button @click="addItem(1)">新增</el-button></td>
+          </tr>
+
+          <!-- item2 -->
+          <tr class="greenbg">
+            <td>2、</td>
+            <td>CTM Activities</td>
+            <td></td>
+            <td></td>
+          </tr>
+          <tr class="greenbg" v-for="(item2, index) in form.items2" :key="'item2'+index">
+            <td>2.{{ 1 + index}}</td>
+            <td><el-input v-model="item2.description"></el-input></td>
+            <td><el-select v-model="item2.actionby">
+              <el-option
+                v-for="dict in actionOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              ></el-option>
+            </el-select></td>
+            <td><el-button type="text" @click="deleteItem(2, index)">移除</el-button></td>
+          </tr>
+          <tr class="greenbg" style="text-align: right">
+            <td colspan="4"><el-button @click="addItem(2)">新增</el-button></td>
+          </tr>
+
+          <!-- item3 -->
+          <tr class="yellowbg">
+            <td>3、</td>
+            <td>CTA Activities</td>
+            <td></td>
+            <td></td>
+          </tr>
+          <tr class="yellowbg" v-for="(item3, index) in form.items3" :key="'item3'+index">
+            <td>3.{{ 1 + index}}</td>
+            <td><el-input v-model="item3.description"></el-input></td>
+            <td><el-select v-model="item3.actionby">
+              <el-option
+                v-for="dict in actionOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              ></el-option>
+            </el-select></td>
+            <td><el-button type="text" @click="deleteItem(3, index)">移除</el-button></td>
+          </tr>
+          <tr class="yellowbg" style="text-align: right">
+            <td colspan="4"><el-button @click="addItem(3)">新增</el-button></td>
+          </tr>
+          <!-- item4 -->
+          <tr class="greenbg">
+            <td>4、</td>
+            <td>高危作业</td>
+            <td></td>
+            <td></td>
+          </tr>
+          <tr class="greenbg" v-for="(item4, index) in form.items4" :key="'item4'+index">
+            <td>4.{{ 1 + index}}</td>
+            <td><el-input v-model="item4.description"></el-input></td>
+            <td><el-select v-model="item4.actionby">
+              <el-option
+                v-for="dict in actionOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              ></el-option>
+            </el-select></td>
+            <td><el-button type="text" @click="deleteItem(4, index)">移除</el-button></td>
+          </tr>
+          <tr class="greenbg" style="text-align: right">
+            <td colspan="4"><el-button @click="addItem(4)">新增</el-button></td>
+          </tr>
+          <!-- item5 -->
+          <tr class="yellowbg">
+            <td>5、</td>
+            <td>其他</td>
+            <td></td>
+            <td></td>
+          </tr>
+          <tr class="yellowbg" v-for="(item5, index) in form.items5" :key="'item5'+index">
+            <td>2.{{ 1 + index}}</td>
+            <td><el-input v-model="item5.description">
+
+            </el-input></td>
+            <td><el-select v-model="item5.actionby">
+              <el-option
+                v-for="dict in actionOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              ></el-option>
+            </el-select></td>
+            <td><el-button type="text" @click="deleteItem(5, index)">移除</el-button></td>
+          </tr>
+          <tr class="yellowbg" style="text-align: right">
+            <td colspan="4"><el-button @click="addItem(5)">新增</el-button></td>
+          </tr>
+        </table>
+      </el-form>
+      <el-form label-width="100px">
+        <el-form-item style="text-align: center;margin-left:-100px;margin-top:10px;">
+          <el-button type="primary" @click="submitForm()">提交</el-button>
+          <el-button @click="close()">返回</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+</template>
+
+<script>
+import { listDailyMeeting, getDailyMeeting, delDailyMeeting, addDailyMeeting, updateDailyMeeting, exportDailyMeeting, importTemplate} from "@/api/plant/dailyMeeting";
+import { listDailyMeetingConfig, getDailyMeetingConfig} from "@/api/plant/dailyMeetingConfig";
+
+export default {
+  data () {
+    return {
+      venueOptions: null,
+      optModeOptions: null,
+      optItemOptions: null,
+      recorderOptions: null,
+      attendCrackerOptions: [],
+      attendCtmOptions: [],
+      attendCtaOptions: [],
+      attendLabOptions: [],
+      actionOptions: null,
+      attendCrackerList: [],
+      attendCtmList: [],
+      attendCtaList: [],
+      attendLabList: [],
+      optItemList: [],
+      form: {
+        id: null,
+        recorder: null,
+        meetingNo: null,
+        meetingDate: null,
+        venue: null,
+        subject: null,
+        attendCracker: null,
+        attendCtm: null,
+        attendCta: null,
+        attendLab: null,
+        safetyTopic: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+
+        optItem: null,
+        deptId: null,
+        val1: '',
+        val2: '',
+        val3: '',
+        val4: '',
+        val5: '',
+        val6: '',
+        items1: [{
+
+        }],
+        items2: [{
+
+        }],
+        items3: [{
+
+        }],
+        items4: [{
+
+        }],
+        items5: [{
+
+        }]
+      }
+    }
+  },
+  created() {
+    getDailyMeetingConfig(1).then(response => { // 地点
+      this.venueOptions = response.data.dictList;
+    });
+    getDailyMeetingConfig(2).then(response => { // 运行模式
+      this.optModeOptions = response.data.dictList;
+    });
+    getDailyMeetingConfig(3).then(response => { // 运行明细
+      this.optItemOptions = response.data.dictList;
+      if (pId == 0) {
+        this.optItemList = response.data.dictList.map(item => item.dictLabel)
+      }
+    });
+    getDailyMeetingConfig(4).then(response => { // 记录人
+      this.recorderOptions = response.data.dictList;
+    });
+    getDailyMeetingConfig(5).then(response => { // cracker
+      this.attendCrackerOptions = response.data.dictList;
+      if (pId == 0) {
+        this.attendCrackerList = response.data.dictList.map(item => item.dictLabel)
+      }
+    });
+    getDailyMeetingConfig(6).then(response => { // cracker
+      this.attendCtmOptions = response.data.dictList;
+      if (pId == 0) {
+        this.attendCtmList = response.data.dictList.map(item => item.dictLabel)
+      }
+    });
+    getDailyMeetingConfig(7).then(response => { // cracker
+      this.attendCtaOptions = response.data.dictList;
+      if (pId == 0) {
+        this.attendCtaList = response.data.dictList.map(item => item.dictLabel)
+      }
+    });
+    getDailyMeetingConfig(8).then(response => { // cracker
+      this.attendLabOptions = response.data.dictList;
+      if (pId == 0) {
+        this.attendLabList = response.data.dictList.map(item => item.dictLabel)
+      }
+    });
+    getDailyMeetingConfig(9).then(response => { // cracker
+      this.actionOptions = response.data.dictList;
+    });
+    const pId = this.$route.params && this.$route.params.id;
+    if (pId != 0) {
+      getDailyMeeting(pId).then(response => {
+        this.form = response.data
+        this.optItemList=  response.data.optItem.split(",")
+        this.attendCrackerList= response.data.attendCracker.split(",")
+        this.attendCtmList= response.data.attendCtm.split(",")
+        this.attendCtaList= response.data.attendCta.split(",")
+        this.attendLabList= response.data.attendLab.split(",")
+      });
+    }else {
+      this.attendCrackerList = this.attendCrackerOptions;
+    }
+  },
+  methods: {
+    addItem (type) {
+      if (type === 1) {
+        this.form.items1.push({description: '', actionby: ''})
+      } else if (type === 2) {
+        this.form.items2.push({description: '', actionby: ''})
+      }else if (type === 3) {
+        this.form.items3.push({description: '', actionby: ''})
+      }else if (type === 4) {
+        this.form.items4.push({description: '', actionby: ''})
+      }else if (type === 5) {
+        this.form.items5.push({description: '', actionby: ''})
+      }
+    },
+    deleteItem (type, index) {
+      if (type === 1) {
+        this.form.items1.splice(index, 1)
+      } else if (type === 2) {
+        this.form.items2.splice(index, 1)
+      }else if (type === 3) {
+        this.form.items3.splice(index, 1)
+      }else if (type === 4) {
+        this.form.items4.splice(index, 1)
+      }else if (type === 5) {
+        this.form.items5.splice(index, 1)
+      }
+    },
+    /** 提交按钮 */
+    submitForm() {
+      if (this.form.id != null) {
+        this.form.optItem = this.optItemList.join(",")
+        this.form.attendCracker = this.attendCrackerList.join(",")
+        this.form.attendCtm = this.attendCtmList.join(",")
+        this.form.attendCta = this.attendCtaList.join(",")
+        this.form.attendLab = this.attendLabList.join(",")
+        updateDailyMeeting(this.form).then(response => {
+          this.msgSuccess("修改成功");
+        });
+      } else {
+        this.form.optItem = this.optItemList.join(",")
+        this.form.attendCracker = this.attendCrackerList.join(",")
+        this.form.attendCtm = this.attendCtmList.join(",")
+        this.form.attendCta = this.attendCtaList.join(",")
+        this.form.attendLab = this.attendLabList.join(",")
+        addDailyMeeting(this.form).then(response => {
+          this.msgSuccess("新增成功");
+          this.close()
+        });
+      }
+    },
+    /** 关闭按钮 */
+    close() {
+      this.$store.dispatch("tagsView/delView", this.$route);
+      this.$router.push({ path: "/plant/meeting/dailyMeeting", query: { t: Date.now()}})
+    }
+  },
+
+}
+</script>
+<style lang="scss" scoped>
+  .meetingbg{
+    background-color: #D9E2F3;
+  }
+  .yellowbg{
+    background-color: #FFF3CB;
+  }
+  .greenbg{
+    background-color: #E2EFD9;
+  }
+  .color-table td, .color-table th{
+    padding: 10px 12px;
+  }
+</style>

+ 451 - 0
ui/src/views/plant/dailyMeeting/index.vue

@@ -0,0 +1,451 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="会议时间" prop="meetingDate">
+        <el-date-picker clearable size="small" style="width: 200px"
+          v-model="queryParams.meetingDate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择会议时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="会议地点" prop="venue">
+        <el-input
+          v-model="queryParams.venue"
+          placeholder="请输入会议地点"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="主题" prop="subject">
+        <el-input
+          v-model="queryParams.subject"
+          placeholder="请输入主题"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['plant:dailyMeeting:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['plant:dailyMeeting:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['plant:dailyMeeting:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-edit"
+          size="mini"
+          @click="handleConfig"
+          v-hasPermi="['plant:dailyMeeting:edit']"
+        >调度会议配置</el-button>
+      </el-col>
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="warning"-->
+<!--          icon="el-icon-download"-->
+<!--          size="mini"-->
+<!--          @click="handleExport"-->
+<!--          v-hasPermi="['plant:dailyMeeting:export']"-->
+<!--        >导出</el-button>-->
+<!--      </el-col>-->
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="dailyMeetingList" @selection-change="handleSelectionChange" :height="clientHeight" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="会议时间" align="center" prop="meetingDate" width="100">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.meetingDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="记录人" align="center" prop="recorderName" :show-overflow-tooltip="true"/>
+      <el-table-column label="会议地点" align="center" prop="venue" :show-overflow-tooltip="true"/>
+      <el-table-column label="主题" align="center" prop="subject" :show-overflow-tooltip="true"/>
+      <el-table-column label="所属部门" align="center" prop="deptName" :show-overflow-tooltip="true"/>
+      <el-table-column label="操作" align="center" fixed="right" width="300" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['plant:dailyMeeting:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-mail"
+            @click="handleMail(scope.row)"
+            v-hasPermi="['plant:dailyMeeting:remove']"
+          >发送邮件</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-mail"
+            @click="handleCc(scope.row)"
+            v-hasPermi="['plant:dailyMeeting:remove']"
+          >配置抄送人</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改调度会议对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="抄送人" >
+          <el-select
+                     v-model="ccerList"
+                     placeholder="请选择抄送人"
+                     style="width: 100%"
+                     filterable
+                     multiple
+          >
+            <el-option
+              v-for="dict in principalList"
+              :key="dict.staffId"
+              :label="dict.nickName"
+              :value="dict.staffId">
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+      <!-- 用户导入对话框 -->
+      <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+          <el-upload
+                  ref="upload"
+                  :limit="1"
+                  accept=".xlsx, .xls"
+                  :headers="upload.headers"
+                  :action="upload.url + '?updateSupport=' + upload.updateSupport"
+                  :disabled="upload.isUploading"
+                  :on-progress="handleFileUploadProgress"
+                  :on-success="handleFileSuccess"
+                  :auto-upload="false"
+                  drag
+          >
+              <i class="el-icon-upload"></i>
+              <div class="el-upload__text">
+                  将文件拖到此处,或
+                  <em>点击上传</em>
+              </div>
+              <div class="el-upload__tip" slot="tip">
+                  <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
+                  <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
+              </div>
+              <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
+          </el-upload>
+          <div slot="footer" class="dialog-footer">
+              <el-button type="primary" @click="submitFileForm">确 定</el-button>
+              <el-button @click="upload.open = false">取 消</el-button>
+          </div>
+      </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listDailyMeeting,sendMail, getDailyMeeting, delDailyMeeting, addDailyMeeting, updateDailyMeeting, exportDailyMeeting, importTemplate} from "@/api/plant/dailyMeeting";
+import { treeselect } from "@/api/system/dept";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import {listPostUser} from "@/api/system/user";
+
+export default {
+  name: "DailyMeeting",
+  components: { Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      ccerList: null,
+      principalList: null,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 调度会议表格数据
+      dailyMeetingList: [],
+      // 弹出层标题
+      title: "",
+      // 部门树选项
+      deptOptions: undefined,
+      clientHeight:300,
+      // 是否显示弹出层
+      open: false,
+        // 用户导入参数
+        upload: {
+            // 是否显示弹出层(用户导入)
+            open: false,
+            // 弹出层标题(用户导入)
+            title: "",
+            // 是否禁用上传
+            isUploading: false,
+            // 是否更新已经存在的用户数据
+            updateSupport: 0,
+            // 设置上传的请求头部
+            headers: { Authorization: "Bearer " + getToken() },
+            // 上传的地址
+            url: process.env.VUE_APP_BASE_API + "/plant/dailyMeeting/importData"
+        },
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        recorder: null,
+        meetingNo: null,
+        meetingDate: null,
+        venue: null,
+        subject: null,
+        attendCracker: null,
+        attendCtm: null,
+        attendCta: null,
+        attendLab: null,
+        safetyTopic: null,
+        deptId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  watch: {
+        // 根据名称筛选部门树
+        deptName(val) {
+            this.$refs.tree.filter(val);
+        }
+   },
+  created() {
+      //设置表格高度对应屏幕高度
+      this.$nextTick(() => {
+          this.clientHeight = document.body.clientHeight -250
+      })
+    this.getList();
+    this.getTreeselect();
+    listPostUser({}).then(response => {
+      this.principalList = response;})
+  },
+  methods: {
+    /** 查询调度会议列表 */
+    getList() {
+      this.loading = true;
+      listDailyMeeting(this.queryParams).then(response => {
+        this.dailyMeetingList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+     /** 查询部门下拉树结构 */
+     getTreeselect() {
+          treeselect().then(response => {
+              this.deptOptions = response.data;
+          });
+     },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        recorder: null,
+        meetingNo: null,
+        meetingDate: null,
+        venue: null,
+        subject: null,
+        attendCracker: null,
+        attendCtm: null,
+        attendCta: null,
+        attendLab: null,
+        safetyTopic: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        optMode: null,
+        optItem: null,
+        split: null,
+        pgu: null,
+        aeu: null,
+        optItemList: [],
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.title = "添加调度会议";
+      this.$router.push("/plant/meeting/detail/0");
+
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      // getDailyMeeting(id).then(response => {
+      //   this.form = response.data;
+      //   this.open = true;
+      //   this.title = "修改调度会议";
+      // });
+      this.$router.push("/plant/meeting/detail/" + id);
+    },
+    handleConfig(){
+      this.$router.push("/plant/meeting/dailyMeetingConfig");
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateDailyMeeting(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delDailyMeeting(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有调度会议数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportDailyMeeting(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        })
+    },
+      /** 导入按钮操作 */
+      handleImport() {
+          this.upload.title = "用户导入";
+          this.upload.open = true;
+      },
+      /** 下载模板操作 */
+      importTemplate() {
+          importTemplate().then(response => {
+              this.download(response.msg);
+          });
+      },
+      // 文件上传中处理
+      handleFileUploadProgress(event, file, fileList) {
+          this.upload.isUploading = true;
+      },
+      // 文件上传成功处理
+      handleFileSuccess(response, file, fileList) {
+          this.upload.open = false;
+          this.upload.isUploading = false;
+          this.$refs.upload.clearFiles();
+          this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
+          this.getList();
+      },
+      // 提交上传文件
+      submitFileForm() {
+          this.$refs.upload.submit();
+      },
+      handleMail(row){
+        let parm = {id: row.id}
+        sendMail(parm).then(response => {
+          this.msgSuccess("发送成功");
+        });
+      },
+    handleCc(row){
+      this.reset();
+      this.ccerList = null
+      this.title = "配置抄送人";
+      this.open = true
+    }
+  }
+};
+</script>

+ 382 - 0
ui/src/views/plant/dailyMeetingConfig/index.vue

@@ -0,0 +1,382 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="参数名称" prop="configName">
+        <el-input
+          v-model="queryParams.configName"
+          placeholder="请输入参数名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="参数键名" prop="configKey">
+        <el-input
+          v-model="queryParams.configKey"
+          placeholder="请输入参数键名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="参数键值" prop="configValue">
+        <el-input
+          v-model="queryParams.configValue"
+          placeholder="请输入参数键值"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['plant:dailyMeetingConfig:edit']"
+        >修改</el-button>
+      </el-col>
+
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="dailyMeetingConfigList" @selection-change="handleSelectionChange" :height="clientHeight" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="参数名称" align="center" prop="configName" :show-overflow-tooltip="true"/>
+      <el-table-column label="参数键名" align="center" prop="configKey" :show-overflow-tooltip="true"/>
+      <el-table-column label="参数键值" align="center" prop="configValue" :show-overflow-tooltip="true"/>
+      <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true"/>
+      <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['plant:dailyMeetingConfig:edit']"
+          >修改</el-button>
+
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改调度会议配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="参数名称" prop="configName">
+          <el-input v-model="form.configName" placeholder="请输入参数名称" />
+        </el-form-item>
+        <el-form-item label="参数键名" prop="configKey">
+          <el-input v-model="form.configKey" placeholder="请输入参数键名" />
+        </el-form-item>
+        <el-form-item label="参数键值" prop="configValue">
+          <el-input v-if="form.configType == 0" v-model="form.configValue" placeholder="请输入参数键值" />
+          <el-select v-else
+            v-model="configValueList"
+            placeholder="请选择区域负责人"
+            style="width: 100%"
+            filterable
+            multiple
+          >
+            <el-option
+              v-for="dict in principalList"
+              :key="dict.staffId"
+              :label="dict.nickName"
+              :value="dict.staffId">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+      <!-- 用户导入对话框 -->
+      <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+          <el-upload
+                  ref="upload"
+                  :limit="1"
+                  accept=".xlsx, .xls"
+                  :headers="upload.headers"
+                  :action="upload.url + '?updateSupport=' + upload.updateSupport"
+                  :disabled="upload.isUploading"
+                  :on-progress="handleFileUploadProgress"
+                  :on-success="handleFileSuccess"
+                  :auto-upload="false"
+                  drag
+          >
+              <i class="el-icon-upload"></i>
+              <div class="el-upload__text">
+                  将文件拖到此处,或
+                  <em>点击上传</em>
+              </div>
+              <div class="el-upload__tip" slot="tip">
+                  <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
+                  <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
+              </div>
+              <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
+          </el-upload>
+          <div slot="footer" class="dialog-footer">
+              <el-button type="primary" @click="submitFileForm">确 定</el-button>
+              <el-button @click="upload.open = false">取 消</el-button>
+          </div>
+      </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listDailyMeetingConfig, getDailyMeetingConfig, delDailyMeetingConfig, addDailyMeetingConfig, updateDailyMeetingConfig, exportDailyMeetingConfig, importTemplate} from "@/api/plant/dailyMeetingConfig";
+import { treeselect } from "@/api/system/dept";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import {listPostUser} from "@/api/system/user";
+
+export default {
+  name: "DailyMeetingConfig",
+  components: { Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      principalList: null,
+      configValueList: null,
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 调度会议配置表格数据
+      dailyMeetingConfigList: [],
+      // 弹出层标题
+      title: "",
+      // 部门树选项
+      deptOptions: undefined,
+      clientHeight:300,
+      // 是否显示弹出层
+      open: false,
+        // 用户导入参数
+        upload: {
+            // 是否显示弹出层(用户导入)
+            open: false,
+            // 弹出层标题(用户导入)
+            title: "",
+            // 是否禁用上传
+            isUploading: false,
+            // 是否更新已经存在的用户数据
+            updateSupport: 0,
+            // 设置上传的请求头部
+            headers: { Authorization: "Bearer " + getToken() },
+            // 上传的地址
+            url: process.env.VUE_APP_BASE_API + "/plant/dailyMeetingConfig/importData"
+        },
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        configName: null,
+        configKey: null,
+        configValue: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  watch: {
+        // 根据名称筛选部门树
+        deptName(val) {
+            this.$refs.tree.filter(val);
+        }
+   },
+  created() {
+      //设置表格高度对应屏幕高度
+      this.$nextTick(() => {
+          this.clientHeight = document.body.clientHeight -250
+      })
+    this.getList();
+    this.getTreeselect();
+    listPostUser({}).then(response => {
+        this.principalList = response;})
+  },
+  methods: {
+    /** 查询调度会议配置列表 */
+    getList() {
+      this.loading = true;
+      listDailyMeetingConfig(this.queryParams).then(response => {
+        this.dailyMeetingConfigList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+     /** 查询部门下拉树结构 */
+     getTreeselect() {
+          treeselect().then(response => {
+              this.deptOptions = response.data;
+          });
+     },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        configName: null,
+        configKey: null,
+        configValue: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null,
+        configType: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加调度会议配置";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getDailyMeetingConfig(id).then(response => {
+        this.form = response.data;
+        if (this.form.configType == 1) {
+          this.configValueList = response.data.configValue.split(",")
+        }
+        this.open = true;
+        this.title = "修改调度会议配置";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            if (this.form.configType == 1) {
+              this.form.configValue = this.configValueList.join(",")
+            }
+            updateDailyMeetingConfig(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addDailyMeetingConfig(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delDailyMeetingConfig(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有调度会议配置数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportDailyMeetingConfig(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        })
+    },
+      /** 导入按钮操作 */
+      handleImport() {
+          this.upload.title = "用户导入";
+          this.upload.open = true;
+      },
+      /** 下载模板操作 */
+      importTemplate() {
+          importTemplate().then(response => {
+              this.download(response.msg);
+          });
+      },
+      // 文件上传中处理
+      handleFileUploadProgress(event, file, fileList) {
+          this.upload.isUploading = true;
+      },
+      // 文件上传成功处理
+      handleFileSuccess(response, file, fileList) {
+          this.upload.open = false;
+          this.upload.isUploading = false;
+          this.$refs.upload.clearFiles();
+          this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
+          this.getList();
+      },
+      // 提交上传文件
+      submitFileForm() {
+          this.$refs.upload.submit();
+      }
+  }
+};
+</script>

+ 502 - 0
ui/src/views/plant/dailyMeetingitem/index.vue

@@ -0,0 +1,502 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="daily_id" prop="dailyId">
+        <el-input
+          v-model="queryParams.dailyId"
+          placeholder="请输入daily_id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="item" prop="item">
+        <el-input
+          v-model="queryParams.item"
+          placeholder="请输入item"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="描述" prop="description">
+        <el-input
+          v-model="queryParams.description"
+          placeholder="请输入描述"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="执行人" prop="actionby">
+        <el-input
+          v-model="queryParams.actionby"
+          placeholder="请输入执行人"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建人" prop="createrCode">
+        <el-input
+          v-model="queryParams.createrCode"
+          placeholder="请输入创建人"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createdate">
+        <el-date-picker clearable size="small" style="width: 200px"
+          v-model="queryParams.createdate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择创建时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="更新人" prop="updaterCode">
+        <el-input
+          v-model="queryParams.updaterCode"
+          placeholder="请输入更新人"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="更新日期" prop="updatedate">
+        <el-date-picker clearable size="small" style="width: 200px"
+          v-model="queryParams.updatedate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择更新日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="所属部门" prop="deptId">
+        <el-input
+          v-model="queryParams.deptId"
+          placeholder="请输入所属部门"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['plant:dailyMeetingitem:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['plant:dailyMeetingitem:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['plant:dailyMeetingitem:remove']"
+        >删除</el-button>
+      </el-col>
+        <el-col :span="1.5">
+            <el-button
+                    type="info"
+                    icon="el-icon-upload2"
+                    size="mini"
+                    @click="handleImport"
+                    v-hasPermi="['plant:dailyMeetingitem:edit']"
+            >导入</el-button>
+        </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['plant:dailyMeetingitem:export']"
+        >导出</el-button>
+      </el-col>
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="dailyMeetingitemList" @selection-change="handleSelectionChange" :height="clientHeight" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="id" align="center" prop="id" :show-overflow-tooltip="true"/>
+      <el-table-column label="daily_id" align="center" prop="dailyId" :show-overflow-tooltip="true"/>
+      <el-table-column label="item" align="center" prop="item" :show-overflow-tooltip="true"/>
+      <el-table-column label="描述" align="center" prop="description" :show-overflow-tooltip="true"/>
+      <el-table-column label="执行人" align="center" prop="actionby" :show-overflow-tooltip="true"/>
+      <el-table-column label="创建人" align="center" prop="createrCode" :show-overflow-tooltip="true"/>
+      <el-table-column label="创建时间" align="center" prop="createdate" width="100">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createdate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新人" align="center" prop="updaterCode" :show-overflow-tooltip="true"/>
+      <el-table-column label="更新日期" align="center" prop="updatedate" width="100">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.updatedate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="所属部门" align="center" prop="deptId" :show-overflow-tooltip="true"/>
+      <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['plant:dailyMeetingitem:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['plant:dailyMeetingitem:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改调度会议详情对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="daily_id" prop="dailyId">
+          <el-input v-model="form.dailyId" placeholder="请输入daily_id" />
+        </el-form-item>
+        <el-form-item label="item" prop="item">
+          <el-input v-model="form.item" placeholder="请输入item" />
+        </el-form-item>
+        <el-form-item label="描述" prop="description">
+          <el-input v-model="form.description" placeholder="请输入描述" />
+        </el-form-item>
+        <el-form-item label="执行人" prop="actionby">
+          <el-input v-model="form.actionby" placeholder="请输入执行人" />
+        </el-form-item>
+        <el-form-item label="删除" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除" />
+        </el-form-item>
+        <el-form-item label="创建人" prop="createrCode">
+          <el-input v-model="form.createrCode" placeholder="请输入创建人" />
+        </el-form-item>
+        <el-form-item label="创建时间" prop="createdate">
+          <el-date-picker clearable size="small" style="width: 200px"
+            v-model="form.createdate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择创建时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="更新人" prop="updaterCode">
+          <el-input v-model="form.updaterCode" placeholder="请输入更新人" />
+        </el-form-item>
+        <el-form-item label="更新日期" prop="updatedate">
+          <el-date-picker clearable size="small" style="width: 200px"
+            v-model="form.updatedate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择更新日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="所属部门" prop="deptId">
+          <el-input v-model="form.deptId" placeholder="请输入所属部门" />
+        </el-form-item>
+          <el-form-item label="归属部门" prop="deptId">
+              <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="请选择归属部门" />
+          </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+      <!-- 用户导入对话框 -->
+      <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+          <el-upload
+                  ref="upload"
+                  :limit="1"
+                  accept=".xlsx, .xls"
+                  :headers="upload.headers"
+                  :action="upload.url + '?updateSupport=' + upload.updateSupport"
+                  :disabled="upload.isUploading"
+                  :on-progress="handleFileUploadProgress"
+                  :on-success="handleFileSuccess"
+                  :auto-upload="false"
+                  drag
+          >
+              <i class="el-icon-upload"></i>
+              <div class="el-upload__text">
+                  将文件拖到此处,或
+                  <em>点击上传</em>
+              </div>
+              <div class="el-upload__tip" slot="tip">
+                  <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
+                  <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
+              </div>
+              <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
+          </el-upload>
+          <div slot="footer" class="dialog-footer">
+              <el-button type="primary" @click="submitFileForm">确 定</el-button>
+              <el-button @click="upload.open = false">取 消</el-button>
+          </div>
+      </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listDailyMeetingitem, getDailyMeetingitem, delDailyMeetingitem, addDailyMeetingitem, updateDailyMeetingitem, exportDailyMeetingitem, importTemplate} from "@/api/plant/dailyMeetingitem";
+import { treeselect } from "@/api/system/dept";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "DailyMeetingitem",
+  components: { Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 总条数
+      total: 0,
+      // 调度会议详情表格数据
+      dailyMeetingitemList: [],
+      // 弹出层标题
+      title: "",
+      // 部门树选项
+      deptOptions: undefined,
+      clientHeight:300,
+      // 是否显示弹出层
+      open: false,
+        // 用户导入参数
+        upload: {
+            // 是否显示弹出层(用户导入)
+            open: false,
+            // 弹出层标题(用户导入)
+            title: "",
+            // 是否禁用上传
+            isUploading: false,
+            // 是否更新已经存在的用户数据
+            updateSupport: 0,
+            // 设置上传的请求头部
+            headers: { Authorization: "Bearer " + getToken() },
+            // 上传的地址
+            url: process.env.VUE_APP_BASE_API + "/plant/dailyMeetingitem/importData"
+        },
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        dailyId: null,
+        item: null,
+        description: null,
+        actionby: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  watch: {
+        // 根据名称筛选部门树
+        deptName(val) {
+            this.$refs.tree.filter(val);
+        }
+   },
+  created() {
+      //设置表格高度对应屏幕高度
+      this.$nextTick(() => {
+          this.clientHeight = document.body.clientHeight -250
+      })
+    this.getList();
+    this.getTreeselect();
+  },
+  methods: {
+    /** 查询调度会议详情列表 */
+    getList() {
+      this.loading = true;
+      listDailyMeetingitem(this.queryParams).then(response => {
+        this.dailyMeetingitemList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+     /** 查询部门下拉树结构 */
+     getTreeselect() {
+          treeselect().then(response => {
+              this.deptOptions = response.data;
+          });
+     },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        dailyId: null,
+        item: null,
+        description: null,
+        actionby: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加调度会议详情";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getDailyMeetingitem(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改调度会议详情";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateDailyMeetingitem(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addDailyMeetingitem(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delDailyMeetingitem(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有调度会议详情数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportDailyMeetingitem(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        })
+    },
+      /** 导入按钮操作 */
+      handleImport() {
+          this.upload.title = "用户导入";
+          this.upload.open = true;
+      },
+      /** 下载模板操作 */
+      importTemplate() {
+          importTemplate().then(response => {
+              this.download(response.msg);
+          });
+      },
+      // 文件上传中处理
+      handleFileUploadProgress(event, file, fileList) {
+          this.upload.isUploading = true;
+      },
+      // 文件上传成功处理
+      handleFileSuccess(response, file, fileList) {
+          this.upload.open = false;
+          this.upload.isUploading = false;
+          this.$refs.upload.clearFiles();
+          this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
+          this.getList();
+      },
+      // 提交上传文件
+      submitFileForm() {
+          this.$refs.upload.submit();
+      }
+  }
+};
+</script>

+ 27 - 11
ui/src/views/plant/organization/index.vue

@@ -49,7 +49,7 @@
             <i  class="iconfont icon-triangle"></i>危化品应急处置小组成员
             <i  class="iconfont icon-square"></i>班组安全代表
             <i  class="iconfont icon-plus"></i>急救员
-            <i  class="iconfont icon-round"></i>义务消防员
+            <i  class="iconfont icon-round"></i>志愿消防员
             <i  class="iconfont icon-yuanjiaoliujiaoxing"></i>安委会成员
             <i  class="iconfont icon-shebeitubiao_famen"></i>TDS负责人
           </div>
@@ -679,18 +679,34 @@ export default {
           console.log('EHS督导')
           item.secretary = null
         }
-        if (item.pId !== 0 && map[item.pId]) {
-          // map[item.pId].children ? map[item.pId].children.push(item) : map[item.pId].children = [item];
-          if (item.post == '装置副经理' || item.post == 'EHS督导') {
-            map[item.pId].secretary ? map[item.pId].secretary[0].push(item) : map[item.pId].secretary[0] = [item];
-          } else if (item.post == '生产主管' || item.post == '工长') {
-            map[item.pId].secretary[1].push(item)
-          }else if ((item.post == '资深工程师' || item.post == '工程师') && map[item.pId].pId == 0) { //直属装置经理的资深工程师
-            map[item.pId].secretary ? map[item.pId].secretary[0].push(item) : map[item.pId].secretary[0] = [item];
-          } else {
-            map[item.pId].children ? map[item.pId].children.push(item) : map[item.pId].children = [item];
+        if(this.$store.state.user.homeType == 5) { //合成器生产主管和工程师再一个位置
+          if (item.pId !== 0 && map[item.pId]) {
+            // map[item.pId].children ? map[item.pId].children.push(item) : map[item.pId].children = [item];
+            if (item.post == '装置副经理' || item.post == 'EHS督导') {
+              map[item.pId].secretary ? map[item.pId].secretary[0].push(item) : map[item.pId].secretary[0] = [item];
+            } else if (item.post == '生产主管' || item.post == '工长') {
+              map[item.pId].secretary[0].push(item)
+            }else if ((item.post == '资深工程师' || item.post == '工程师') && map[item.pId].pId == 0) { //直属装置经理的资深工程师
+              map[item.pId].secretary ? map[item.pId].secretary[0].push(item) : map[item.pId].secretary[0] = [item];
+            } else {
+              map[item.pId].children ? map[item.pId].children.push(item) : map[item.pId].children = [item];
+            }
+          }
+        }else {
+          if (item.pId !== 0 && map[item.pId]) {
+            // map[item.pId].children ? map[item.pId].children.push(item) : map[item.pId].children = [item];
+            if (item.post == '装置副经理' || item.post == 'EHS督导') {
+              map[item.pId].secretary ? map[item.pId].secretary[0].push(item) : map[item.pId].secretary[0] = [item];
+            } else if (item.post == '生产主管' || item.post == '工长') {
+              map[item.pId].secretary[1].push(item)
+            }else if ((item.post == '资深工程师' || item.post == '工程师') && map[item.pId].pId == 0) { //直属装置经理的资深工程师
+              map[item.pId].secretary ? map[item.pId].secretary[0].push(item) : map[item.pId].secretary[0] = [item];
+            } else {
+              map[item.pId].children ? map[item.pId].children.push(item) : map[item.pId].children = [item];
+            }
           }
         }
+
       });
       return list.filter(item => {
         if (item.pId === 0) {

+ 103 - 0
ui/src/views/plant/staffmgr/ageChart.vue

@@ -0,0 +1,103 @@
+<template>
+  <div>
+    <div id="ageChart" :style="{width:width,height:height}"></div>
+  </div>
+</template>
+
+<script>
+  import { ageData } from "@/api/plant/staffmgr";
+  export default {
+    props: {
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '200px'
+      },
+      queryParams : {
+        type: Object,
+        required: true
+      }
+    },
+    data() {
+      return {
+        option: {
+          title: {
+            subtext: '年龄分布',
+            left: 'center'
+          },
+          tooltip: {
+            trigger: 'item',
+            formatter: '{a} <br/>{b} : {c} ({d}%)'
+          },
+          legend: {
+            orient: 'vertical',
+            left: 'left',
+            data: [this.$t('直接访问'), this.$t('邮件营销'), this.$t('联盟广告'), this.$t('视频广告'), this.$t('搜索引擎')]
+          },
+          toolbox: {
+            show: true,
+            feature: {
+              mark: {show: true},
+              magicType: {
+                show: true,
+                type: ['pie', 'funnel']
+              },
+              restore: {show: true},
+              saveAsImage: {show: true}
+            }
+          },
+          series: [
+            {
+              label: {
+                formatter: '{b}: ({d}%)'
+              },
+              name: '年龄段',
+              type: 'pie',
+              radius: ['50%', '70%'],
+              selectedMode: 'single',
+              data: [
+                {value: 335, name: this.$t('直接访问')},
+              ],
+              emphasis: {
+                label: {
+                  show: true,
+                  fontSize: '21',
+                  fontWeight: 'bold'
+                }
+              },
+            }
+          ]
+        },
+
+        chart: null,
+        ageData : []
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        ageData(this.queryParams).then(response => {
+          this.ageData = response
+          for(let i = 0 ; i <this.ageData.length ; i++){
+            this.option.legend.data[i] = this.ageData[i].dataName
+            this.option.series[0].data[i] = {value:this.ageData[i].dataNum , name: this.ageData[i].dataName }
+          }
+          this.initChart()
+        });
+      })
+    },
+    methods: {
+      /** 获取当前年份 */
+      getNowTime() {
+        var now = new Date();
+      },
+      initChart() {
+        // 基于准备好的dom,初始化echarts实例
+        this.chart = this.echarts.init(document.getElementById('ageChart'))
+        this.chart.setOption(this.option)
+      }
+    }
+  }
+</script>

+ 15 - 4
ui/src/views/plant/staffmgr/eduChart.vue

@@ -16,6 +16,10 @@
         type: String,
         default: '200px'
       },
+      queryParams : {
+        type: Object,
+        required: true
+      }
     },
     data() {
       return {
@@ -67,10 +71,7 @@
             }
           ]
         },
-        // 查询参数
-        queryParams: {
-          item: 1,
-        },
+
         chart: null,
         eduData : []
       }
@@ -88,6 +89,16 @@
       })
     },
     methods: {
+      change(queryParams){
+        eduData(queryParams).then(response => {
+          this.eduData = response
+          for(let i = 0 ; i <this.eduData.length ; i++){
+            this.option.legend.data[i] = this.eduData[i].dataName
+            this.option.series[0].data[i] = {value:this.eduData[i].dataNum , name: this.eduData[i].dataName }
+          }
+          this.initChart()
+        });
+      },
       /** 获取当前年份 */
       getNowTime() {
         var now = new Date();

+ 15 - 5
ui/src/views/plant/staffmgr/engChart.vue

@@ -5,7 +5,7 @@
 </template>
 
 <script>
-  import { engData } from "@/api/plant/staffmgr";
+import {engData, teamData} from "@/api/plant/staffmgr";
   export default {
     props: {
       width: {
@@ -16,6 +16,10 @@
         type: String,
         default: '200px'
       },
+      queryParams : {
+        type: Object,
+        required: true
+      }
     },
     data() {
       return {
@@ -66,10 +70,6 @@
             }
           ]
         },
-        // 查询参数
-        queryParams: {
-          item: 1,
-        },
         chart: null,
         engData : []
       }
@@ -87,6 +87,16 @@
       })
     },
     methods: {
+      change(queryParams){
+        engData(queryParams).then(response => {
+          this.engData = response
+          for(let i = 0 ; i <this.engData.length ; i++){
+            this.option.legend.data[i] = this.engData[i].dataName
+            this.option.series[0].data[i] = {value:this.engData[i].dataNum , name: this.engData[i].dataName}
+          }
+          this.initChart()
+        });
+      },
       /** 获取当前年份 */
       getNowTime() {
         var now = new Date();

+ 18 - 4
ui/src/views/plant/staffmgr/index.vue

@@ -597,6 +597,7 @@
       :title="$t('数据分析')"
       size="600px"
       :visible.sync="drawer"
+      :destroy-on-close = "true"
       :direction="direction">
       <el-row>
         <el-col>
@@ -605,7 +606,19 @@
               <span>{{ $t('学历统计') }}</span>
             </div>
             <div class="text item">
-              <edu-chart> </edu-chart>
+              <edu-chart :queryParams = "this.queryParams" ref="educhart"> </edu-chart>
+            </div>
+          </el-card>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col>
+          <el-card class="box-card" shadow="hover">
+            <div slot="header" class="clearfix">
+              <span>年龄统计</span>
+            </div>
+            <div class="text item">
+              <age-chart :queryParams = "this.queryParams" > </age-chart>
             </div>
           </el-card>
         </el-col>
@@ -617,7 +630,7 @@
               <span>{{ $t('英语统计') }}</span>
             </div>
             <div class="text item">
-              <eng-chart> </eng-chart>
+              <eng-chart :queryParams = "this.queryParams" ref="engchart"> </eng-chart>
             </div>
           </el-card>
         </el-col>
@@ -629,7 +642,7 @@
               <span>{{ $t('班值统计') }}</span>
             </div>
             <div class="text item">
-              <team-chart> </team-chart>
+              <team-chart :queryParams = "this.queryParams" ref="teamchart"> </team-chart>
             </div>
           </el-card>
         </el-col>
@@ -648,10 +661,11 @@
   import EduChart from "./eduChart";
   import EngChart from "./engChart";
   import TeamChart from "./teamChart";
+  import AgeChart from "./ageChart";
 
   export default {
     name: "Staffmgr",
-    components: {TeamChart, EngChart, EduChart, Treeselect },
+    components: {TeamChart, EngChart, EduChart, Treeselect,AgeChart },
     data() {
       return {
         drawer: false,

+ 14 - 3
ui/src/views/plant/staffmgr/teamChart.vue

@@ -16,6 +16,10 @@
         type: String,
         default: '200px'
       },
+      queryParams : {
+        type: Object,
+        required: true
+      }
     },
     data() {
       return {
@@ -67,9 +71,6 @@
           ]
         },
         // 查询参数
-        queryParams: {
-          item: 1,
-        },
         chart: null,
         chartData : []
       }
@@ -87,6 +88,16 @@
       })
     },
     methods: {
+      change(queryParams){
+        teamData(queryParams).then(response => {
+          this.chartData = response
+          for(let i = 0 ; i <this.chartData.length ; i++){
+            this.option.legend.data[i] = this.chartData[i].dataName
+            this.option.series[0].data[i] = {value:this.chartData[i].dataNum , name: this.chartData[i].dataName }
+          }
+          this.initChart()
+        });
+      },
       /** 获取当前年份 */
       getNowTime() {
         var now = new Date();

+ 16 - 0
ui/src/views/training/training/index.vue

@@ -51,6 +51,16 @@
                 label="未参培"
                 value="1"
               />
+              <el-option
+                key="2"
+                label="已完成"
+                value="2"
+              />
+              <el-option
+                key="3"
+                label="未完成"
+                value="3"
+              />
             </el-select>
         </el-form-item>
       <el-form-item :label="$t('培训开始日期')" label-width="60">
@@ -766,6 +776,12 @@ export default {
     if (queryName == '未参培'){
       this.queryParams.isNon = "1"
     }
+    if (queryName == '已完成'){
+      this.queryParams.isNon = "2"
+    }
+    if (queryName == '未完成'){
+      this.queryParams.isNon = "3"
+    }
 
     this.getStaffmar();
     this.getStaffmarAll();