Browse Source

系统基础设置配置更改

seyason 1 năm trước cách đây
mục cha
commit
a109aa1c09

+ 52 - 11
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -640,20 +640,56 @@ public class ReportController {
                 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                 //检查填报日期,是否早于限制的日期
                 boolean isForbidden = false;
+                boolean isLastMonthFail = false;
+                LocalDate fillDay = LocalDate.now().withDayOfMonth(compTimeType.getFillMonthOnDay());
                 if (createDate.length > 0) {
-                    //日期都是一样的,取第一个就行了
                     String createDateOne = createDate[0];
-                    if (createDateOne.contains("@")) {
-                        String[] dateArray = createDateOne.split("@");
-                        String startDate = dateArray[0];
-                        LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
-                        if (localStartDate.isBefore(targetDate)) {
-                            isForbidden = true;
+                    //日期都是一样的,取第一个就行了
+                    if (fillMonths == 2) {
+                        //补填到上个月的情况,要检查当前日期,是否在设置的日期之前
+                        LocalDate lastMonth = LocalDate.now().minusMonths(1);
+                        if (createDateOne.contains("@")) {
+                            String[] dateArray = createDateOne.split("@");
+                            String startDate = dateArray[0];
+                            LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
+                            if (localStartDate.isBefore(targetDate)) {
+                                isForbidden = true;
+                            } else {
+                                if (localStartDate.getMonth().getValue() == lastMonth.getMonth().getValue()) {
+                                    //补填到上个月的情况,要检查当前日期,是否在设置的日期之前
+                                    if (LocalDate.now().isAfter(fillDay)) {
+                                        isForbidden = true;
+                                        isLastMonthFail = true;
+                                    }
+                                }
+                            }
+                        } else {
+                            //单日填报,检查日期是否早于限制时间
+                            if (LocalDate.parse(createDateOne, dateTimeFormatter).isBefore(targetDate)) {
+                                isForbidden = true;
+                            } else {
+                                if (LocalDate.parse(createDateOne, dateTimeFormatter).getMonth().getValue() == lastMonth.getMonth().getValue()) {
+                                    //补填到上个月的情况,要检查当前日期,是否在设置的日期之前
+                                    if (LocalDate.now().isAfter(fillDay)) {
+                                        isForbidden = true;
+                                        isLastMonthFail = true;
+                                    }
+                                }
+                            }
                         }
                     } else {
-                        //单日填报,检查日期是否早于限制时间
-                        if (LocalDate.parse(createDateOne, dateTimeFormatter).isBefore(targetDate)) {
-                            isForbidden = true;
+                        if (createDateOne.contains("@")) {
+                            String[] dateArray = createDateOne.split("@");
+                            String startDate = dateArray[0];
+                            LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
+                            if (localStartDate.isBefore(targetDate)) {
+                                isForbidden = true;
+                            }
+                        } else {
+                            //单日填报,检查日期是否早于限制时间
+                            if (LocalDate.parse(createDateOne, dateTimeFormatter).isBefore(targetDate)) {
+                                isForbidden = true;
+                            }
                         }
                     }
                 }
@@ -668,7 +704,12 @@ public class ReportController {
                         //不存在驳回的日报
                         HttpRespMsg msg = new HttpRespMsg();
                         //msg.setError("补填日报不可早于"+dateTimeFormatter.format(targetDate)+",请联系系统管理员代填。");
-                        msg.setError(MessageUtils.message("profession.repairError",dateTimeFormatter.format(targetDate)));
+                        if (!isLastMonthFail) {
+                            msg.setError(MessageUtils.message("profession.repairError",dateTimeFormatter.format(targetDate)));
+                        } else {
+                            msg.setError("不得晚于"+dateTimeFormatter.format(fillDay)+"后补填,请联系系统管理员代填。");
+                        }
+
                         return msg;
                     }
                 }

+ 13 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2023-10-31
+ * @since 2023-11-08
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -498,6 +498,18 @@ public class TimeType extends Model<TimeType> {
     @TableField("enable_new_weeklyfill")
     private Integer enableNewWeeklyfill;
 
+    /**
+     * 默认每月1号提醒上个月
+     */
+    @TableField("alert_day")
+    private Integer alertDay;
+
+    /**
+     * 默认每月3号前可补填上个月日报
+     */
+    @TableField("fill_month_on_day")
+    private Integer fillMonthOnDay;
+
 
     @Override
     protected Serializable pkVal() {

+ 7 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -1237,7 +1237,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             Map<String, Object> resultMap = new HashMap<>();
             //当前用户管理部门
             List<Integer> deptIds=null;
-            List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
+            List<Department> allDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
             List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", targetUser.getId()).eq("company_id", companyId));
             List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("other_manager_id", targetUser.getId()));
             List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看全公司");
@@ -2172,11 +2172,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
             }
             //首先查看有无浏览权限
-            if (!projectMapper.selectById(projectId).getCompanyId().equals(companyId)) {
+            Project project = projectMapper.selectById(projectId);
+            if (!project.getCompanyId().equals(companyId)) {
                 //httpRespMsg.setError("无权查看其他公司的项目详情");
                 httpRespMsg.setError(MessageUtils.message("access.otherCompanyProject"));
             } else {
                 Map<String, Object> resultMap = new HashMap<>();
+                //项目经理,可以查看项目下的全部人员工时
+                if (targetUser.getId().equals(project.getInchargerId())) {
+                    deptIds = null;
+                }
                 //数据下 非负责部门人员数据不展示
                 List<Map<String, Object>> list = projectMapper.getProjectCost(companyId,startDate, endDate, projectId,stateKey, null,deptIds,null, false);
                 BigDecimal totalMoneyCost = BigDecimal.valueOf(0);

+ 9 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -4488,7 +4488,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         msg.setError(MessageUtils.message("data.NullErrorByRow",dataCount));
                         return msg;
                     }
-                    for (int i=1;i<=7;i++) {
+                    for (int i=1;i<=8;i++) {
                         if (row.getCell(i) != null) {
                             row.getCell(i).setCellType(CellType.STRING);
                         }
@@ -4563,12 +4563,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             return msg;
                         }
                     }
-
-                    String stringCellValue = row.getCell(7)==null?null:row.getCell(7).getStringCellValue();
+                    String workContent = row.getCell(7)==null?null:row.getCell(7).getStringCellValue();
+                    String stringCellValue = row.getCell(8)==null?null:row.getCell(8).getStringCellValue();
                     double time = 0;
                     if (!StringUtils.isEmpty(stringCellValue)) {
                         time = Double.parseDouble(stringCellValue);
-                        if (time > 0) {
+                        if (time >= 0) {
                             Report report = new Report();
                             report.setCompanyId(companyId);
                             report.setCreatorId(reportCreator.getId());
@@ -4579,6 +4579,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             report.setGroupId(groupId);
                             report.setReportTimeType(1);
                             report.setWorkingTime(time);
+                            report.setContent(workContent);
                             report.setMultiWorktime(timeType.getMultiWorktime());
                             report.setFillUserid(user.getId());
                             if (timeType.getNeedDeptAudit() == 0) {
@@ -5562,6 +5563,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     map.put("corpwxUserid", curUser.getCorpwxUserid());
                     map.put("name", curUser.getName());
                     map.put("days", 1);
+                    map.put("daysTxt", date.format(DateTimeFormatter.ofPattern("MM/dd")));
                     if (!noReportDataList.stream().anyMatch(noItem->noItem.get("corpwxUserid").equals(curUser.getCorpwxUserid()))) {
                         noReportDataList.add(map);
                     }
@@ -5569,6 +5571,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     Map<String, Object> findUser = noReportDataList.stream().filter(data -> data.get("corpwxUserid").equals(curUser.getCorpwxUserid())).findFirst().get();
                     Object days = findUser.get("days");
                     findUser.put("days", (Integer)days + 1);
+                    if ((Integer)days + 1 < 4) {
+                        findUser.put("daysTxt", findUser.get("daysTxt") + "," + date.format(DateTimeFormatter.ofPattern("MM/dd")));
+                    }
                 }
             }
         }

+ 28 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -1286,7 +1286,7 @@ public class TimingTask {
                     } else {
                         userList = userMapper.getPushUserList(t.getCompanyId(),t.getAlertType(), null);
                     }
-                } else if (t.getAlertType() == 2){
+                } else if (t.getAlertType() == 2) {
                     //2--每周最后一个工作日提醒本周的,先检查日期是否匹配
                     //获取本周最后一个工作日
                     LocalDate sunday = localDate.with(DayOfWeek.SUNDAY);
@@ -1306,7 +1306,7 @@ public class TimingTask {
                         transfDay = transfDay.plusDays(1);
                     }
                     //如果今天就是最后一个工作日
-                    if (lastWorkDay.isEqual(localDate) ||"2023-11-03".equals(dtf.format(localDate))) {
+                    if (lastWorkDay.isEqual(localDate)) {
                         recentlyNotFill = false;
                         LocalDate startDate = localDate.with(DayOfWeek.MONDAY);
                         userList = reportService.getNotFullReportUserList(company.getId(), startDate, lastDay);
@@ -1316,6 +1316,19 @@ public class TimingTask {
                         userList = reportService.getNotFullReportUserList(company.getId(), startDate, localDate.minusDays(1));
                         recentlyNotFill = true;
                     }
+                } else if (t.getAlertType() == 3) {
+                    //3--每月固定日期提醒上个月的
+                    Integer alertDay = t.getAlertDay();
+                    if (alertDay == null) {
+                        return;
+                    }
+                    if (alertDay.equals(localDate.getDayOfMonth())) {
+                        //获取上个月的开始和节数日期
+                        LocalDate startDate = localDate.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
+                        LocalDate endDate = localDate.minusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
+                        userList = reportService.getNotFullReportUserList(company.getId(), startDate, endDate);
+                    }
+                    recentlyNotFill = false;
                 } else {
                     recentlyNotFill = false;
                 }
@@ -1329,12 +1342,22 @@ public class TimingTask {
                         JSONArray dataJson=new JSONArray();
                         JSONObject jsonObj=new JSONObject();
                         jsonObj.put("key", "提示");
-                        if (recentlyNotFill) {
-                            jsonObj.put("value", "您近期有"+(Integer)u.get("days")+"天未填写工时报告,请尽快填写");
+                        if (t.getAlertType() == 3) {
+                            //每月提醒上个月的
+                            if ((Integer)u.get("days") > 3) {
+                                jsonObj.put("value", "您上个月有"+u.get("daysTxt")+"...共"+(Integer)u.get("days")+"天未填写工时报告,请尽快填写");
+                            } else {
+                                jsonObj.put("value", "您上个月有"+u.get("daysTxt")+"共"+(Integer)u.get("days")+"天未填写工时报告,请尽快填写");
+                            }
                         } else {
-                            jsonObj.put("value", StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg());
+                            if (recentlyNotFill) {
+                                jsonObj.put("value", "您近期有"+(Integer)u.get("days")+"天未填写工时报告,请尽快填写");
+                            } else {
+                                jsonObj.put("value", StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg());
+                            }
                         }
 
+
                         dataJson.add(jsonObj);
                         if(isPrivateDeploy){
                             json.put("content",StringUtils.isEmpty(t.getAlertMsg())?"":t.getAlertMsg()+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid="+suitId+"&redirect_uri="+pcUrl+"/api/corpInsideWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去填写</a>");

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


BIN
fhKeeper/formulahousekeeper/management-platform/src/main/resources/upload/员工工时导入模板_新版.xlsx


+ 150 - 131
fhKeeper/formulahousekeeper/timesheet/index.html

@@ -1,149 +1,168 @@
 <!DOCTYPE html>
 <html>
-    <head>
-        <meta charset="utf-8">
-        <!-- 尝试清除打包缓存 -->
-        <!-- <meta http-equiv="pragram" content="no-cache">
+  <head>
+    <meta charset="utf-8" />
+    <!-- 尝试清除打包缓存 -->
+    <!-- <meta http-equiv="pragram" content="no-cache">
         <meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate">
         <meta http-equiv="expires" content="0"> -->
-        <!-- 尝试清除打包缓存 -->
-        <title>工时管家</title>
-        <link rel="shortcut icon" type="image/x-icon" href="./favicon.ico"/>
-        <link href="./static/css/public.css" rel="stylesheet" type="text/css"/>
-        <!-- 引入样式 -->
-        <link href="https://cdn.staticfile.org/element-ui/2.13.0/theme-chalk/index.css" rel="stylesheet">
-        <!-- <link rel="stylesheet" href="./static/js/element-uiCss.css"> -->
-        <!-- 接入JQ  -->
-        <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
-        <!-- <script src="./static/js/jquery.min.js"></script> -->
-        <style>
-            /* 滚动条样式修改 */
-            /*滚动条凹槽的颜色,还可以设置边框属性 */
-            ::-webkit-scrollbar-track-piece {
-                background-color:#f8f8f8;
-                -webkit-border-radius: 2em;
-                -moz-border-radius: 2em;
-                border-radius: 2em;
-            }
-            /*滚动条的宽度*/
-            ::-webkit-scrollbar {
-                width:9px;
-            height: 9px;}
-            /*滚动条的设置*/
-            ::-webkit-scrollbar-thumb {
-                background-color:#dddddd;
-                background-clip:padding-box;
-                -webkit-border-radius: 2em;
-                -moz-border-radius: 2em;
-                border-radius: 2em;}
+    <!-- 尝试清除打包缓存 -->
+    <title>工时管家</title>
+    <link rel="shortcut icon" type="image/x-icon" href="./favicon.ico" />
+    <link href="./static/css/public.css" rel="stylesheet" type="text/css" />
+    <!-- 引入样式 -->
+    <link
+      href="https://cdn.staticfile.org/element-ui/2.13.0/theme-chalk/index.css"
+      rel="stylesheet"
+    />
+    <!-- <link rel="stylesheet" href="./static/js/element-uiCss.css"> -->
+    <!-- 接入JQ  -->
+    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
+    <!-- <script src="./static/js/jquery.min.js"></script> -->
+    <style>
+      /* 滚动条样式修改 */
+      /*滚动条凹槽的颜色,还可以设置边框属性 */
+      ::-webkit-scrollbar-track-piece {
+        background-color: #f8f8f8;
+        -webkit-border-radius: 2em;
+        -moz-border-radius: 2em;
+        border-radius: 2em;
+      }
+      /*滚动条的宽度*/
+      ::-webkit-scrollbar {
+        width: 9px;
+        height: 9px;
+      }
+      /*滚动条的设置*/
+      ::-webkit-scrollbar-thumb {
+        background-color: #dddddd;
+        background-clip: padding-box;
+        -webkit-border-radius: 2em;
+        -moz-border-radius: 2em;
+        border-radius: 2em;
+      }
 
-            /*滚动条鼠标移上去*/
-            ::-webkit-scrollbar-thumb:hover {
-                background-color:#bbb;
-            }
+      /*滚动条鼠标移上去*/
+      ::-webkit-scrollbar-thumb:hover {
+        background-color: #bbb;
+      }
 
-            /*取消消息列表弹出框的内边距*/
-            .popover-self {
-                padding: 0 !important;
-            }
+      /*取消消息列表弹出框的内边距*/
+      .popover-self {
+        padding: 0 !important;
+      }
 
-            /*自定义颜色*/
-            #nprogress .bar {
-                background:#f58220 !important; 
-            }
+      /*自定义颜色*/
+      #nprogress .bar {
+        background: #f58220 !important;
+      }
 
-            .selectworktime .el-dialog__header{
-                padding-top:0;
-                padding-bottom:0;
-            }
-            .selectworktime .el-dialog__body{
-                padding-top:15px;
-            }
-            .el-dialog__headerbtn{
-                z-index: 2002;
-            }
-            .selecteorktime_datapick_popper{
-                left: 12vh !important;
-            }
-            .customsalary .el-input__inner{
-                height: 35px;
-                line-height: 35px;
-            }
-            .projectSelectPopperClass{
-                max-width: 1000px;
-            }
-            .projectSelectPopperClass li{
-                overflow: hidden;
-                white-space: nowrap;
-                text-overflow: ellipsis;
-            }
-            .projectSelectPopperClass .el-select-dropdown__item span:nth-child(1){
-                font-size: 13px;
-                height: 34px;
-                max-width: 350px;
-            }
-            .projectSelectPopperClass .el-select-dropdown__item span:nth-child(2){
-                font-size: 13px;
-                height: 34px;
-                max-width: 650px;
-                
-                text-align: right;
-            }
+      .selectworktime .el-dialog__header {
+        padding-top: 0;
+        padding-bottom: 0;
+      }
+      .selectworktime .el-dialog__body {
+        padding-top: 15px;
+      }
+      .el-dialog__headerbtn {
+        z-index: 2002;
+      }
+      .selecteorktime_datapick_popper {
+        left: 12vh !important;
+      }
+      .customsalary .el-input__inner {
+        height: 35px;
+        line-height: 35px;
+      }
+      .projectSelectPopperClass {
+        max-width: 1000px;
+      }
+      .projectSelectPopperClass li {
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+      }
+      .projectSelectPopperClass .el-select-dropdown__item span:nth-child(1) {
+        font-size: 13px;
+        height: 34px;
+        max-width: 350px;
+      }
+      .projectSelectPopperClass .el-select-dropdown__item span:nth-child(2) {
+        font-size: 13px;
+        height: 34px;
+        max-width: 650px;
 
-            /* 清除浮动 */
-	.clearfix:after{
-		content: ""; 
-		display: block; 
-		height: 0; 
-		clear: both; 
-		visibility: hidden;  
-	}
-	.clearfix {
-		/* 触发 hasLayout */ 
-		zoom: 1; 
-	}
-        </style>
-        <!-- <meta name="wpk-bid" content="dta_2_71020"> <script>var isDingtalk = navigator && /DingTalk/.test(navigator.userAgent);var isProductEnv = window &&window.location &&window.location.host 
+        text-align: right;
+      }
+
+      /* 清除浮动 */
+      .clearfix:after {
+        content: "";
+        display: block;
+        height: 0;
+        clear: both;
+        visibility: hidden;
+      }
+      .clearfix {
+        /* 触发 hasLayout */
+        zoom: 1;
+      }
+      .fillWeekCustom {
+        .el-dialog__body {
+          padding: 10px 20px !important;
+        }
+      }
+    </style>
+    <!-- <meta name="wpk-bid" content="dta_2_71020"> <script>var isDingtalk = navigator && /DingTalk/.test(navigator.userAgent);var isProductEnv = window &&window.location &&window.location.host 
             && window.location.host.indexOf('//127.0.0.1')===-1
             && window.location.host.indexOf('//localhost')===-1
             && window.location.host.indexOf('//192.168.')===-1
             // 如果有其它测试域名,请一起排掉,减少测试环境对生产环境监控的干扰
         if (isProductEnv) {    !(function(c,i,e,b){var h=i.createElement("script");var f=i.getElementsByTagName("script")[0];h.type="text/javascript";h.crossorigin=true;h.onload=function(){c[b]||(c[b]=new c.wpkReporter({bid:"dta_2_71020"}));c[b].installAll()};f.parentNode.insertBefore(h,f);h.src=e})(window,document,"https://g.alicdn.com/woodpeckerx/jssdk??wpkReporter.js","__wpk"); }</script> -->
-    </head>
-    <!-- 接入飞书 -->
-    <script type="text/javascript" src="https://lf1-cdn-tos.bytegoofy.com/goofy/lark/op/h5-js-sdk-1.5.16.js"></script>
-    <!-- <script src="./static/js/goofy.js"></script> -->
-    <!-- <script src="https://unpkg.com/vconsole/dist/vconsole.min.js"></script>
+  </head>
+  <!-- 接入飞书 -->
+  <script
+    type="text/javascript"
+    src="https://lf1-cdn-tos.bytegoofy.com/goofy/lark/op/h5-js-sdk-1.5.16.js"
+  ></script>
+  <!-- <script src="./static/js/goofy.js"></script> -->
+  <!-- <script src="https://unpkg.com/vconsole/dist/vconsole.min.js"></script>
     <script>
         var vConsole = new window.VConsole();
     </script> -->
-    <body>
-        <div id="app"></div>
-        <script>
-            document.body.ondrop = function(event) {
-            event.preventDefault()
-            event.stopPropagation()
-            }
-        </script>
-        <!-- 引入Vue.js -->
-        <script src="https://cdn.staticfile.org/vue/2.6.10/vue.min.js"></script>
-        <!-- <script src="./static/js/vue.min.js"></script> -->
-        <!-- 引入vuex.js -->
-        <script src="https://cdn.staticfile.org/vuex/3.0.0/vuex.min.js"></script>
-        <!-- <script src="./static/js/vuex.min.js"></script> -->
-        <!-- 引入vue-router -->
-        <script src="https://cdn.staticfile.org/vue-router/3.0.0/vue-router.min.js"></script>
-        <!-- <script src="./static/js/vue-router.min.js"></script> -->
-        <!-- 引入组件库 -->
-        <script src="https://cdn.staticfile.org/element-ui/2.13.0/index.js"></script>
-        <!-- <script src="./static/js/element-ui.js"></script> -->
-        <!-- 引入echarts -->
-        <script src="https://cdn.staticfile.org/echarts/3.8.5/echarts.min.js"></script>
-        <!-- <script src="./static/js/echarts.min.js"></script> -->
-        <!-- 引入企业微信js -->
-        <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js" referrerpolicy="origin"></script>
-        <script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js" referrerpolicy="origin"></script>
-        <!-- <script src="./static/js/jweixin-1.2.0.js"></script>
+  <body>
+    <div id="app"></div>
+    <script>
+      document.body.ondrop = function (event) {
+        event.preventDefault();
+        event.stopPropagation();
+      };
+    </script>
+    <!-- 引入Vue.js -->
+    <script src="https://cdn.staticfile.org/vue/2.6.10/vue.min.js"></script>
+    <!-- <script src="./static/js/vue.min.js"></script> -->
+    <!-- 引入vuex.js -->
+    <script src="https://cdn.staticfile.org/vuex/3.0.0/vuex.min.js"></script>
+    <!-- <script src="./static/js/vuex.min.js"></script> -->
+    <!-- 引入vue-router -->
+    <script src="https://cdn.staticfile.org/vue-router/3.0.0/vue-router.min.js"></script>
+    <!-- <script src="./static/js/vue-router.min.js"></script> -->
+    <!-- 引入组件库 -->
+    <script src="https://cdn.staticfile.org/element-ui/2.13.0/index.js"></script>
+    <!-- <script src="./static/js/element-ui.js"></script> -->
+    <!-- 引入echarts -->
+    <script src="https://cdn.staticfile.org/echarts/3.8.5/echarts.min.js"></script>
+    <!-- <script src="./static/js/echarts.min.js"></script> -->
+    <!-- 引入企业微信js -->
+    <script
+      src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"
+      referrerpolicy="origin"
+    ></script>
+    <script
+      src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"
+      referrerpolicy="origin"
+    ></script>
+    <!-- <script src="./static/js/jweixin-1.2.0.js"></script>
         <script src="./static/js/jwxwork-1.0.0.js"></script> -->
-    </body>
-</html>
+  </body>
+</html>

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json

@@ -929,6 +929,7 @@
   "missingfill": "Daily reminder missed filling on the day",
   "missingfills": "Daily reminder missed yesterday",
   "lastDayOfWeek": "Remind on the last day of current week",
+  "monthAlert": "Remind last month's missed report on fixed day",
   "morningtime": "morning time",
   "owntimeframe": "Choose your own time frame",
   "personneltoset": "Don't remind people settings",

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -938,6 +938,7 @@
   "missingfill": "每日提醒当天漏填",
   "missingfills": "每日提醒昨天漏填",
   "lastDayOfWeek": "每周最后一个工作日",
+  "monthAlert": "每月固定日期提醒上个月",
   "remindertext": "提醒文本",
   "personneltoset": "不提醒人员设置",
   "addTian": "添加",

+ 16 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -210,12 +210,16 @@
                             <el-option :label="$t('missingfill')" :value="0"></el-option>
                             <el-option :label="$t('missingfills')" :value="1"></el-option>
                             <el-option :label="$t('lastDayOfWeek')" :value="2"></el-option>
+                            <el-option :label="$t('monthAlert')" :value="3"></el-option>
                         </el-select>
+                        <span v-if="timeType.alertType == 3" style="color:#606266;">(每月
+                        <el-select v-model="timeType.alertDay" style="width:80px;">
+                            <el-option v-for="item in alertDayRange" :label="item" :value="item" :key="item"></el-option>
+                        </el-select>
+                        号)</span>
                     </el-form-item>
-                    <el-form-item :label="$t('remindertext')" prop="alertMsg" style="width: 50%;margin-left:10px;">
+                    <el-form-item v-if="timeType.alertType != 3" :label="$t('remindertext')" prop="alertMsg" style="width: 50%;margin-left:10px;">
                             <el-input :placeholder="$t('peaseenterthe')" v-model="timeType.alertMsg" clearable class="apu" maxlength="20"></el-input>
-                            <!-- <div style="display: inline-block;margin: 0 10px 0 20px" v-if="timeType.alertTime">周末节假日提醒</div> -->
-                            <!-- <el-switch v-if="timeType.alertTime" v-model="timeType.alertNonWorkday" active-color="#13ce66" inactive-color="#ff4949"></el-switch> -->
                     </el-form-item>
                     
                     </el-form>
@@ -278,6 +282,14 @@
                         <el-option v-for="item in monthTimeList" :key="item.id" :label="item.name" :value="item.id">
                         </el-option>
                     </el-select>
+                    <span v-if="timeType.fillMonths == 2" style="color:#606266;">,于次月
+                        <el-select v-model="timeType.fillMonthOnDay" style="width:80px;">
+                            <el-option v-for="item in alertDayRange" :key="item" :label="item" :value="item">
+                            </el-option>
+                        </el-select>
+                        号(含)前填报。
+                    </span>
+                    
                     <span style="color:#666;margin-left:10px;">{{ $t('instructions') }}</span>
                     <span class="lockworktime"><el-checkbox v-model="timeType.fillAhead" :label="$t('filledinadvance')" /></span>
                 </el-form-item><br>
@@ -633,7 +645,7 @@
                     onPreviousStep: this.myCustomPreviousStepCallback,   //在data中定义两个回调
                     onNextStep: this.myCustomNextStepCallback
                 },
-
+                alertDayRange: ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15'],
                 pushParam:{
                     day:'05',
                     hour:'01',