Browse Source

Merge branch 'master' of http://47.100.37.243:10080/wutt/manHourHousekeeper into master

# Conflicts:
#	fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
#	fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
seyason 2 năm trước cách đây
mục cha
commit
569a108f7d

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -1449,6 +1449,16 @@ public class ReportController {
         return msg;
     }
 
+    /**
+     * 根据项目返回日报默认的纬度值,默认值是最近一次该项目日报所选择的维度
+     * @param projectId
+     * @return
+     */
+    @RequestMapping("/defaultDegree")
+    public HttpRespMsg defaultDegree(Integer projectId){
+        return reportService.defaultDegree(projectId,request);
+    }
+
     @GetMapping("/getProcessErrorData")
     public HttpRespMsg getProcessErrorData() {
         return reportService.getProcessErrorData();

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -151,4 +151,6 @@ public interface ReportMapper extends BaseMapper<Report> {
     List<Map<String, Object>> getUploadThirdReportData(Integer companyId,@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
 
     List<HashMap<String, Object>> geReportByProject(String startDate, Integer companyId, String endDate);
+
+    Map<String, Object> getDefaultDegree(Integer companyId, String userId, Integer projectId);
 }

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -102,5 +102,7 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg correctWorkingTime(String userIds, String startDate, String endDate);
 
-    HttpRespMsg approveDeptAuditReport(User user, String auditDeptId);
+    HttpRespMsg defaultDegree(Integer projectId, HttpServletRequest request);
+
+	HttpRespMsg approveDeptAuditReport(User user, String auditDeptId);
 }

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -1475,6 +1475,9 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
 
     //递归获取所有上级部门字符串,格式:"上级部门/上级部门/部门"
     public String getSupDepartment(Department department,List<Department> departmentList) {
+        if (department == null){
+            return "";
+        }
         String depHierarchy = department.getDepartmentName();
         //搜到父部门进行添加
         if (department.getSuperiorId()==null) {
@@ -1493,6 +1496,9 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
 
     //用于报表展示:递归获取企业微信所有上级部门字符串,格式:"上级部门/上级部门/部门"
     public String getWxDepartment(Department department,List<Department> departmentList) {
+        if (department == null || department.getCorpwxDeptid() == null){
+            return "";
+        }
         String depHierarchy = department.getCorpwxDeptid()+"";
         //搜到父部门进行添加
         if (department.getCorpwxDeptpid()==null || department.getCorpwxDeptpid()==1) {
@@ -1511,7 +1517,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
 
     //用于导出:递归获取企业微信所有上级部门字符串,格式:"上级部门/上级部门/部门"
     public String exportWxDepartment(Department department,List<Department> departmentList) {
-        if(department.getCorpwxDeptid() == null){
+        if(department == null || department.getCorpwxDeptid() == null){
             return "";
         }
         String depHierarchy = "$departmentName="+department.getCorpwxDeptid()+"$";

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

@@ -4703,6 +4703,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     //递归获取所有上级部门字符串,格式:"上级部门/上级部门/部门"
     private String getSupDepartment(Department department) {
+        if (department == null){
+            return "";
+        }
         String depHierarchy = department.getDepartmentName();
         //搜到父部门进行添加
         if (department.getSuperiorId()==null) {
@@ -4715,6 +4718,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     //用于报表展示:递归获取企业微信所有上级部门字符串,格式:"上级部门/上级部门/部门"
     private String getWxDepartment(Department department) {
+        if (department == null || department.getCorpwxDeptid() == null){
+            return "";
+        }
         String depHierarchy = department.getCorpwxDeptid()+"";
         //搜到父部门进行添加
         if (department.getCorpwxDeptpid()==null || department.getCorpwxDeptpid()==1) {
@@ -4727,7 +4733,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     //用于导出:递归获取企业微信所有上级部门字符串,格式:"上级部门/上级部门/部门"
     private String exportWxDepartment(Department department) {
-        if(department.getCorpwxDeptid() == null){
+        if(department == null || department.getCorpwxDeptid() == null){
             return "";
         }
         String depHierarchy = "$departmentName="+department.getCorpwxDeptid()+"$";

+ 16 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -4089,7 +4089,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 Department dept = null;
                 for (Department department : departments) {
-                    if (department.getDepartmentId().toString().equals(map.get("departmentId").toString())){
+                    if (map.containsKey("departmentId") && department.getDepartmentId().toString().equals(map.get("departmentId").toString())){
                         dept = department;
                         break;
                     }
@@ -5265,6 +5265,21 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return msg;
     }
 
+    /**
+     * 根据项目返回日报默认的纬度值,默认值是最近一次该项目日报所选择的维度
+     * @param projectId
+     * @param request
+     * @return
+     */
+    @Override
+    public HttpRespMsg defaultDegree(Integer projectId, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("token"));
+        Map<String, Object> defaultDegree = reportMapper.getDefaultDegree(user.getCompanyId(), user.getId(), projectId);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        httpRespMsg.data = defaultDegree;
+        return httpRespMsg;
+    }
+
     private void selfUpdateToNextWorkFlow(Integer companyId, User auditTargetUser, List<Integer> targetRids, List<Department> allDepts) {
         List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                 new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", companyId)

+ 11 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -740,4 +740,15 @@
         and `user`.is_active = 1
         group by user.id,rl.create_date
     </select>
+
+    <select id="getDefaultDegree" resultType="java.util.Map">
+        select r.* FROM report
+        LEFT JOIN report_extra_degree as r
+        ON report.degree_id = r.id
+        WHERE report.company_id = #{companyId}
+        AND project_id = #{projectId}
+        AND creator_id = #{userId}
+        ORDER BY create_date DESC
+        LIMIT 0,1
+    </select>
 </mapper>

+ 177 - 131
fhKeeper/formulahousekeeper/octopus/src/views/signing/list.vue

@@ -100,78 +100,78 @@
         </el-dialog>
         <!-- 完善合同信息  需要调下样式--> 
         <el-dialog v-if="editDialogB" :visible.sync="editDialogB" title="完善合同信息" width="1200px">
-            <el-form :inline="true" :model="formInline" class="heClass">
-                <el-form-item label="甲方名称:" label-width="100px">
+            <el-form :inline="true" :model="formInline" :rules="rulesFormInline" ref="formInline" class="heClass">
+                <el-form-item label="甲方名称:" label-width="150px">
                     南京火石闪信网络科技有限公司
                 </el-form-item>
-                <el-form-item  label="乙方名称:" label-width="100px">
-                    <el-input size="small" controls-position="right" v-model="secondParty" :disabled="finalize"  style="width: 300px"></el-input>
+                <el-form-item  label="乙方名称:" label-width="150px" prop="secondParty">
+                    <el-input size="small" controls-position="right" v-model="formInline.secondParty" :disabled="finalize"  style="width: 300px"></el-input>
                 </el-form-item>
-                <el-form-item label="甲方地址:" label-width="100px">
+                <el-form-item label="甲方地址:" label-width="150px">
                     南京市江宁区秣周东路12号悠谷软件园2号楼3楼P346室
                 </el-form-item>
-                <el-form-item label="乙方地址:" label-width="100px">
-                    <el-input size="small" controls-position="right" v-model="secondPartyAddr" :disabled="finalize" style="width: 400px"></el-input>
+                <el-form-item label="乙方地址:" label-width="150px" prop="secondPartyAddr">
+                    <el-input size="small" controls-position="right" v-model="formInline.secondPartyAddr" :disabled="finalize" style="width: 400px"></el-input>
                 </el-form-item>
-                <el-form-item label="甲方联系人:" label-width="100px">
+                <el-form-item label="甲方联系人:" label-width="150px">
                     屈跃庭
                 </el-form-item>
-                <el-form-item label="乙方联系人:" label-width="100px">
-                    <el-input size="small" controls-position="right" v-model="secondPartyContacts" :disabled="finalize" style="width: 150px"></el-input>
+                <el-form-item label="乙方联系人:" label-width="150px" prop="secondPartyContacts">
+                    <el-input size="small" controls-position="right" v-model="formInline.secondPartyContacts" :disabled="finalize" style="width: 150px"></el-input>
                 </el-form-item>
-                <el-form-item label="甲方电话:" label-width="100px">
+                <el-form-item label="甲方电话:" label-width="150px">
                     15895914665
                 </el-form-item>
-                <el-form-item label="乙方电话:" label-width="100px">
-                    <el-input size="small" controls-position="right"  maxlength="11" v-model="secondPartyTel" :disabled="finalize" style="width: 150px"></el-input>
+                <el-form-item label="乙方电话:" label-width="150px" prop="secondPartyTel">
+                    <el-input size="small" controls-position="right"  maxlength="11" v-model="formInline.secondPartyTel" :disabled="finalize" style="width: 150px"></el-input>
                 </el-form-item>
-                <el-form-item label="软件名称:" label-width="100px">
-                    <el-input size="small" controls-position="right" v-model="softwareName" :disabled="finalize" style="width: 200px"></el-input>
+                <el-form-item label="软件名称:" label-width="150px" prop="softwareName">
+                    <el-input size="small" controls-position="right" v-model="formInline.softwareName" :disabled="finalize" style="width: 200px"></el-input>
                 </el-form-item>
-                <el-form-item label="服务周期:" label-width="100px">
-                     <el-input-number size="small" controls-position="right" v-model="serviceDate" :disabled="finalize" style="width: 100px"></el-input-number> 年
+                <el-form-item label="服务周期:" label-width="150px" prop="serviceDate">
+                     <el-input-number size="small" controls-position="right" :min="0" v-model.number="formInline.serviceDate" :disabled="finalize" style="width: 100px"></el-input-number> 年
                 </el-form-item>
-                <el-form-item label="服务开始日期:" label-width="120px">
+                <el-form-item label="服务开始日期:" label-width="150px" prop="startDate">
                     <el-date-picker
-                        v-model="startDate"
+                        v-model="formInline.startDate"
                         :disabled="finalize"
                         type="date"
                         placeholder="选择日期"
                         value-format="yyyy-MM-dd">
                     </el-date-picker>
                 </el-form-item>
-                <el-form-item label="年服务费:" label-width="100px">
-                    <el-input size="small" controls-position="right" v-model="serviceChargeOfYear" :disabled="finalize" style="width: 100px"></el-input> 元
+                <el-form-item label="年服务费:" label-width="150px" prop="serviceChargeOfYear">
+                    <el-input size="small" controls-position="right" v-model.number="formInline.serviceChargeOfYear" :disabled="finalize" style="width: 100px"></el-input> 元
                 </el-form-item>
-                <el-form-item label="定制开发费:" label-width="100px">
-                    <el-input size="small" controls-position="right" v-model="customDevelopmentCosts" :disabled="finalize" style="width: 100px"></el-input> 元
+                <el-form-item label="定制开发费:" label-width="150px" prop="customDevelopmentCosts">
+                    <el-input size="small" controls-position="right" v-model.number="formInline.customDevelopmentCosts" :disabled="finalize" style="width: 100px"></el-input> 元
                 </el-form-item>
-                <el-form-item label="标准单价:" label-width="100px">
-                    <el-input size="small" controls-position="right" v-model="standardUnitPrice" :disabled="finalize" style="width: 100px"></el-input> 元每人每年
+                <el-form-item label="标准单价:" label-width="150px" prop="standardUnitPrice">
+                    <el-input size="small" controls-position="right" v-model.number="formInline.standardUnitPrice" :disabled="finalize" style="width: 100px"></el-input> 元每人每年
                 </el-form-item>
-                <el-form-item label="首次开通人数:" label-width="120px">
-                    <el-input-number size="small" controls-position="right" v-model="firstOpenNum" :disabled="finalize" style="width: 100px"></el-input-number> 人
+                <el-form-item label="首次开通人数:" label-width="150px" prop="firstOpenNum" style="width: 100%">
+                    <el-input-number size="small" :min="0" controls-position="right" v-model.number="formInline.firstOpenNum" :disabled="finalize" style="width: 100px"></el-input-number> 人
                 </el-form-item>
-                <el-form-item label="甲方账号:" label-width="120px">
+                <el-form-item label="甲方账号:" label-width="150px">
                     32050188143600000075
                 </el-form-item>
-                <el-form-item label="甲方开户行:" label-width="120px">
-                    建设银行股份有限公司南京湖北路支行
+                <el-form-item label="乙方账号:" label-width="150px" prop="secondPartyAccount">
+                    <el-input size="small" controls-position="right" v-model="formInline.secondPartyAccount" :disabled="finalize" style="width: 300px"></el-input> 
                 </el-form-item>
-                <el-form-item label="乙方账号:" label-width="120px">
-                    <el-input size="small" controls-position="right" v-model="secondPartyAccount" :disabled="finalize" style="width: 300px"></el-input> 
+                <el-form-item label="甲方开户行:" label-width="150px">
+                    建设银行股份有限公司南京湖北路支行
                 </el-form-item>
-                <el-form-item label="乙方开户行:" label-width="120px">
-                    <el-input size="small" controls-position="right" v-model="secondPartyBankOfDeposit" :disabled="finalize" style="width: 300px"></el-input> 
+                <el-form-item label="乙方开户行:" label-width="150px" prop="secondPartyBankOfDeposit">
+                    <el-input size="small" controls-position="right" v-model="formInline.secondPartyBankOfDeposit" :disabled="finalize" style="width: 300px"></el-input> 
                 </el-form-item>
-                <el-form-item label="乙方开票名称:" label-width="120px">
-                    <el-input size="small" controls-position="right" v-model="secondPartyBillingName" :disabled="finalize" style="width: 200px"></el-input> 
+                <el-form-item label="乙方开票名称:" label-width="150px" prop="secondPartyBillingName">
+                    <el-input size="small" controls-position="right" v-model="formInline.secondPartyBillingName" :disabled="finalize" style="width: 200px"></el-input> 
                 </el-form-item>
-                <el-form-item label="乙方纳税人识别号:" label-width="140px">
-                    <el-input size="small" controls-position="right" v-model="secondPartyTIN" :disabled="finalize" style="width: 200px"></el-input> 
+                <el-form-item label="乙方纳税人识别号:" label-width="150px" prop="secondPartyTIN">
+                    <el-input size="small" controls-position="right" v-model="formInline.secondPartyTIN" :disabled="finalize" style="width: 200px"></el-input> 
                 </el-form-item>
-                <el-form-item label="乙方开具发票类型:" label-width="140px">
-                    <el-select v-model="invoiceType" placeholder="请选择" :disabled="finalize">
+                <el-form-item label="乙方开具发票类型:" label-width="150px" prop="invoiceType">
+                    <el-select v-model="formInline.invoiceType" placeholder="请选择" :disabled="finalize">
                         <el-option
                         v-for="invoiceItem in invoiceOptions"
                         :key="invoiceItem.value"
@@ -183,8 +183,11 @@
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="editDialogB = false">取 消</el-button>
-                <el-button type="primary" @click="ConfirmB()" :loading="listLoading" v-if="!finalize">确定</el-button>
-                <el-button type="primary" @click="ConfirmC()" :loading="listLoading" v-if="!finalize">合同定稿</el-button>
+                <el-button type="primary" @click="ConfirmB('formInline')" :loading="listLoading" v-if="!finalize">确定</el-button>
+                <!-- <el-button type="primary" @click="ConfirmC()" :loading="listLoading" v-if="!finalize">合同定稿</el-button> -->
+                <el-popconfirm confirm-button-text='确定' cancel-button-text='取消' icon="el-icon-info" icon-color="#E6A23C" title="合同定稿将无法再继续编辑 是否确认?" @confirm="ConfirmC()">
+                    <el-button slot="reference" :loading="listLoading" v-if="!finalize">合同定稿</el-button>
+                </el-popconfirm>
             </span>
         </el-dialog>
         <!-- 合同预览/下载 -->
@@ -218,50 +221,54 @@ import axios from 'axios'
                 // 修改有效期
                 expirationNewDate: null,
 
-                //甲方名称
-                firstParty: null,
-                //乙方名称
-                secondParty: null,
-                //甲方地址
-                firstPartyAddr: null,
-                //乙方地址
-                secondPartyAddr: null,
-                //甲方联系人
-                firstPartyContacts: null,
-                //乙方联系人
-                secondPartyContacts: null,
-                //甲方电话
-                firstPartyTel: null,
-                //乙方电话
-                secondPartyTel: null,
-                //软件名称
-                softwareName: null,
-                //服务周期
-                serviceDate:0,
-                //服务开始日期
-                startDate:null,
-                //年服务费
-                serviceChargeOfYear:0,
-                //定制开发费
-                customDevelopmentCosts:0,
-                //标准单价
-                standardUnitPrice:0,
-                //首次开通人数
-                firstOpenNum:0,
-                //甲方账号
-                firstPartyAccount:null,
-                //甲方开户行
-                firstPartyBankOfDeposit:null,
-                //乙方账号
-                secondPartyAccount:null,
-                //乙方开户行
-                secondPartyBankOfDeposit:null,
-                //乙方开票名称
-                secondPartyBillingName:null,
-                //乙方纳税人识别号
-                secondPartyTIN:null,
-                //乙方开具发票类型
-                invoiceType:'',
+                formInline: {
+                    //甲方名称
+                    firstParty: null,
+                    //乙方名称
+                    secondParty: null,
+                    //甲方地址
+                    firstPartyAddr: null,
+                    //乙方地址
+                    secondPartyAddr: null,
+                    //甲方联系人
+                    firstPartyContacts: null,
+                    //乙方联系人
+                    secondPartyContacts: null,
+                    //甲方电话
+                    firstPartyTel: null,
+                    //乙方电话
+                    secondPartyTel: null,
+                    //软件名称
+                    softwareName: null,
+                    //服务周期
+                    serviceDate:0,
+                    //服务开始日期
+                    startDate:null,
+                    //年服务费
+                    serviceChargeOfYear:0,
+                    //定制开发费
+                    customDevelopmentCosts:0,
+                    //标准单价
+                    standardUnitPrice:0,
+                    //首次开通人数
+                    firstOpenNum:0,
+                    //甲方账号
+                    firstPartyAccount:null,
+                    //甲方开户行
+                    firstPartyBankOfDeposit:null,
+                    //乙方账号
+                    secondPartyAccount:null,
+                    //乙方开户行
+                    secondPartyBankOfDeposit:null,
+                    //乙方开票名称
+                    secondPartyBillingName:null,
+                    //乙方纳税人识别号
+                    secondPartyTIN:null,
+                    //乙方开具发票类型
+                    invoiceType:'',
+                },
+
+                
                 //合同定稿
                 finalize:false,
 
@@ -302,6 +309,38 @@ import axios from 'axios'
                     label: '增值税专用发票'
                     },
                 ],
+
+                // 规则校验
+                rulesFormInline: {
+                    secondParty: [{ required: true, message: '请输入乙方名称', trigger: 'blur' }],
+                    secondPartyAddr: [{ required: true, message: '请输入乙方地址', trigger: 'blur' }],
+                    secondPartyContacts: [{ required: true, message: '请输入乙方联系人', trigger: 'blur' }],
+                    secondPartyTel: [{ required: true, message: '请输入乙方电话', trigger: 'blur' }],
+                    softwareName: [{ required: true, message: '请输入软件名称', trigger: 'blur' }],
+                    serviceDate: [{ required: true, message: '请输入服务周期', trigger: 'blur' }],
+                    startDate: [{ required: true, message: '请选择服务开始日期', trigger: 'blur' }],
+                    serviceChargeOfYear: [
+                        { required: true, message: '请输入年服务费', trigger: 'blur' },
+                        { required: true, pattern:/^[a-zA-Z0-9_-]{1,16}$/, message: '请输入数字', trigger: 'change' },
+                    ],
+                    customDevelopmentCosts: [
+                        { required: true, message: '请输入定制开发费', trigger: 'blur' },
+                        { required: true, pattern:/^[a-zA-Z0-9_-]{1,16}$/, message: '请输入数字', trigger: 'change' },
+                    ],
+                    standardUnitPrice: [
+                        { required: true, message: '请输入标准单价', trigger: 'blur' },
+                        { required: true, pattern:/^[a-zA-Z0-9_-]{1,16}$/, message: '请输入数字', trigger: 'change' },
+                    ],
+                    firstOpenNum: [
+                        { required: true, message: '请输入首次开通人数', trigger: 'blur' },
+                        { required: true, pattern:/^[a-zA-Z0-9_-]{1,16}$/, message: '请输入数字', trigger: 'change' },
+                    ],
+                    secondPartyAccount: [{ required: true, message: '请输入乙方账号', trigger: 'blur' }],
+                    secondPartyBankOfDeposit: [{ required: true, message: '请输入乙方开户行', trigger: 'blur' }],
+                    secondPartyBillingName: [{ required: true, message: '请输入乙方开票名称', trigger: 'blur' }],
+                    secondPartyTIN: [{ required: true, message: '请输入乙方纳税人识别号', trigger: 'blur' }],
+                    invoiceType: [{ required: true, message: '请输入乙方开具发票类型', trigger: 'blur' }],
+                },
             };
         },
         // 过滤器
@@ -587,56 +626,63 @@ import axios from 'axios'
                 });
             }, 
             // 完善合同信息
-            ConfirmB(){
-                this.listLoading = true;
-                this.http.post('/contract-detail/update', {
-                companyId:this.dialogData.id,
-                secondParty:this.secondParty,
-                secondPartyAddr:this.secondPartyAddr,
-                secondPartyContacts:this.secondPartyContacts,
-                secondPartyTel:this.secondPartyTel,
-                softwareName:this.softwareName,
-                serviceDate:this.serviceDate,
-                startDate:this.startDate,
-                serviceChargeOfYear:this.serviceChargeOfYear,
-                customDevelopmentCosts:this.customDevelopmentCosts,
-                standardUnitPrice:this.standardUnitPrice,
-                firstOpenNum:this.firstOpenNum,
-                secondPartyAccount:this.secondPartyAccount,
-                secondPartyBankOfDeposit:this.secondPartyBankOfDeposit,
-                secondPartyBillingName:this.secondPartyBillingName,
-                secondPartyTIN:this.secondPartyTIN,
-                billingAmount:this.billingAmount,
-                invoiceType:this.invoiceType,
-                },
-                res => {
-                    this.listLoading = false;
-                    if (res.code == "ok") {
-                        this.editDialogB = false
-                        this.downloadUrl2=res.data
-                        this.$message({
-                            message: "合同信息完善成功,合同模板已重新生成",
-                            type: "success"
-                        })
-                    } else {
-                        this.$message({
-                            message: res.msg,
-                            type: "error"
+            ConfirmB(formName){
+                this.$refs[formName].validate((valid) => {
+                    console.log(valid)
+                    if (valid) {
+                        this.listLoading = true;
+                        this.http.post('/contract-detail/update', {
+                            companyId:this.dialogData.id,
+                            secondParty:this.formInline.secondParty,
+                            secondPartyAddr:this.formInline.secondPartyAddr,
+                            secondPartyContacts:this.formInline.secondPartyContacts,
+                            secondPartyTel:this.formInline.secondPartyTel,
+                            softwareName:this.formInline.softwareName,
+                            serviceDate:this.formInline.serviceDate,
+                            startDate:this.formInline.startDate,
+                            serviceChargeOfYear:this.formInline.serviceChargeOfYear,
+                            customDevelopmentCosts:this.formInline.customDevelopmentCosts,
+                            standardUnitPrice:this.formInline.standardUnitPrice,
+                            firstOpenNum:this.formInline.firstOpenNum,
+                            secondPartyAccount:this.formInline.secondPartyAccount,
+                            secondPartyBankOfDeposit:this.formInline.secondPartyBankOfDeposit,
+                            secondPartyBillingName:this.formInline.secondPartyBillingName,
+                            secondPartyTIN:this.formInline.secondPartyTIN,
+                            billingAmount:this.formInline.billingAmount,
+                            invoiceType:this.formInline.invoiceType,
+                        },
+                        res => {
+                            this.listLoading = false;
+                            if (res.code == "ok") {
+                                this.editDialogB = false
+                                this.downloadUrl2=res.data
+                                this.$message({
+                                    message: "合同信息完善成功,合同模板已重新生成",
+                                    type: "success"
+                                })
+                            } else {
+                                this.$message({
+                                    message: res.msg,
+                                    type: "error"
+                                });
+                            }
+                        },
+                        error => {
+                            this.listLoading = false;
+                            this.$message({
+                                message: error,
+                                type: "error"
+                            });
                         });
+                    } else {
+                        return false;
                     }
-                },
-                error => {
-                    this.listLoading = false;
-                    this.$message({
-                        message: error,
-                        type: "error"
-                    });
                 });
             },
             // 合同定稿
-            ConfirmC(){
+            ConfirmC(){ 
                 this.listLoading = true;
-                this.http.post('//contract-detail/finalize',{companyId:this.dialogData.id,},
+                this.http.post('/contract-detail/finalize',{companyId:this.dialogData.id,},
                 res => {
                     this.listLoading = false;
                     if (res.code == "ok") {
@@ -912,7 +958,7 @@ import axios from 'axios'
 
 <style lang="scss" scoped>
 .heClass .el-form-item {
-    width: 500px;
+    width: 48%
 }
 .rg_span{
     display: inline-block;

+ 5 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue

@@ -242,6 +242,11 @@
                 this.pathList = list;
                 this.getList();
             },
+            clearPathList() {
+                console.log('111')
+                this.pathList = []
+                this.viewFolder(null)
+            },
             rowClick(row, column, event) {
                 if (row.isFolder==1) {
                     //进入子目录

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -3292,6 +3292,7 @@
                 this.$router.push(path);
                 this.getTaskGroups();
                 this.getDetail()
+                this.$refs.fileCenter.clearPathList()
                 this.$refs.fileCenter.refreshPage();
                 this.$refs.projectInfo.refreshPage();
                 this.$refs.summary.refreshPage();

+ 65 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -453,13 +453,18 @@
 
         <!-- 日报提醒白名单 -->
         <el-dialog :title="$t('screening.selectPeople')"  v-if="whiteListDialog" :visible.sync="whiteListDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+            <div v-if="user.userNameNeedTranslate == '1'">
+                <el-input placeholder="请输入名字搜索" v-model.trim="wxFilterText" clearable @clear="clearEchartDepartment()" class="input-with-select">
+                    <el-button slot="append" icon="el-icon-search" @click="echartDepartment()"></el-button>
+                </el-input>
+            </div>
             <div class="tree" style="height:400px">
                 <el-scrollbar style="height:100%">
                     <el-input v-if="user.userNameNeedTranslate != '1'"
                     :placeholder="$t('keywordfiltering')"
                     v-model="filterText">
                     </el-input>
-                <el-tree :data="whiteListAll" show-checkbox :props="defaultProps" node-key="id"
+                <el-tree :data="whiteListAll" :key="searchPersonnelFlgnum" :default-expand-all="searchPersonnelFlg" show-checkbox :props="defaultProps" node-key="id"
                     ref="whiteListTree"
                     highlight-current  :filter-node-method="filterNode">
                         <span class="custom-tree-node" slot-scope="{ node, data }">
@@ -480,7 +485,7 @@
             </div>
             <!-- <div>已选中&nbsp;{{chosenMembCount}}&nbsp;人</div>         :default-checked-keys="alreadyPartArray"  @check-change="onTreeItemChange" -->
             <div slot="footer" class="dialog-footer">
-                <el-button  @click="whiteListDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button  @click="whiteListDialog = false, resetechartDepartment()">{{ $t('btn.cancel') }}</el-button>
                 <el-button type="primary" @click="setWhiteList()">{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
@@ -583,13 +588,19 @@
 
                 whiteListDialog: false,
                 whiteListAll: [],
+                whiteListAllTwo: [], // 备份 whiteListAll 数据
                 whiteList: [],
                 filterText: '',
                 defaultProps: {
                     children: 'children',
                     label: 'label'
                 },
-                maxReportTimeRange: []
+                maxReportTimeRange: [],
+
+                wxFilterText: '', // 企业微信搜索
+
+                searchPersonnelFlg: false,
+                searchPersonnelFlgnum: 1,
             };
         },
         watch: {
@@ -1027,6 +1038,7 @@
                             message: this.$t('addsuccessful'),
                             type: 'success'
                         })
+                        this.resetechartDepartment()
                         this.whiteListDialog = false
                     }else {
                         this.$message({
@@ -1231,6 +1243,56 @@
                     str = str.replace(/^\D*([0-9]\d*\.?\d{0,2})?.*$/,'$1') // 小数点后只能输 2 位
                 }
                 return str
+            },
+            // 企业微信选人搜索
+            echartDepartment() {
+                if(this.wxFilterText != '') {
+                    this.http.post("/department/listAllMemb", {
+                        keyword: this.wxFilterText,
+                        cursor: ''
+                    },
+                    res => {
+                        if (res.code == "ok") {
+                            if(!Array.isArray(res.data)) {
+                                let list = res.data.data
+                                this.haveUsersList(list)
+                                this.whiteListAll = JSON.parse(JSON.stringify(list))
+                                this.whiteListAllTwo = JSON.parse(JSON.stringify(list))
+                            } else {
+                                this.whiteListAll = []
+                            }
+                            this.searchPersonnelFlgnum = +this.searchPersonnelFlgnum +1
+                            this.searchPersonnelFlg = true
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                } else {
+                    this.searchPersonnelFlgnum = +this.searchPersonnelFlgnum +1
+                    this.searchPersonnelFlg = false
+                    this.getWhiteListAll()
+                }
+            },
+            clearEchartDepartment() {
+                this.searchPersonnelFlgnum = +this.searchPersonnelFlgnum +1
+                this.searchPersonnelFlg = false
+                this.getWhiteListAll()
+            },
+            // 重置企业微信选人搜索
+            resetechartDepartment() {
+                this.wxFilterText = ''
+                this.searchPersonnelFlgnum = +this.searchPersonnelFlgnum +1
+                this.searchPersonnelFlg = false
+                this.whiteListAll = this.whiteListAllTwo
             }
 
         },

+ 3 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -210,8 +210,7 @@
                       <div v-if="user.userNameNeedTranslate == 1">
                         <ww-open-data type='userName' :openid='scope.row.name'></ww-open-data>
                       </div>
-                      <div v-else>{{scope.row.name}}</div>
-                    </div>
+                      <div v-else>{{scope.row.name}}</div>                    </div>
                   </template>
                 </el-table-column>
                 <el-table-column prop="jobNumber" :label="$t('Worknumber')" ></el-table-column>
@@ -2410,8 +2409,8 @@ export default {
                 name: res.data.name,
                 phone: res.data.phone,
                 roleId: res.data.roleId,
-                monthCost: res.data.monthCost,
-                cost: res.data.cost,
+                monthCost: res.data.monthCost ? res.data.monthCost : 0,
+                cost: res.data.cost ? res.data.cost : 0,
                 departmentId: array.reverse(),
                 salaryType: res.data.salaryType,
                 costApplyDate: res.data.costApplyDate,

+ 34 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -421,7 +421,7 @@
                                 <el-input :disabled="!domain.canEdit || domain.isOvertime==null || domain.isOvertime==0 || !domain.isOvertime" v-model="domain.overtimeHours" @blur="triggerCalculateOT(index)" @input="domain.overtimeHours=domain.overtimeHours.replace(/[^\d.]/g,'')" style="width: 100px;"></el-input><span style="margin-left:5px">{{$t('time.hour')}}</span>
                             </div>
                         </el-form-item>
-                        
+                    
                         <el-form-item :label="user.companyId==781? $t('screening.workTasks') : $t('screening.inputProject')" :prop="'domains.' + index + '.projectId'"
                             :rules="{ required: true, message: user.companyId==781? $t('defaultText.pleaseSelectaJob'): $t('defaultText.pleaseSelectSnItem'), trigger: ['change','blur'] }">
                             <el-select v-model="domain.projectId" :placeholder="user.companyId==781?$t('defaultText.pleaseSelectaJob'): $t('defaultText.pleaseSelectSnItem')" style="width:200px;" clearable="true"  filterable="true" value-key="id"
@@ -534,6 +534,7 @@
                                 </el-option>
                             </el-select>
                         </el-form-item>
+
                         <!-- 相关数值 -->
                         <el-form-item :label="yonghuUser.customDataName" v-if="yonghuUser.customDataActive == 1" :prop="'domains.' + index + '.customData'" :rules="user.timeType.customDataStatus == 1 ? { type: 'number', required: true, message: $t('defaultText.pleaseFillOut') + yonghuUser.customDataName, trigger: ['change','blur'] } : null">
                             <el-input-number :id="'numberData_'+index" :disabled="!domain.canEdit" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)" :max="user.timeType.customDataMaxStatus == 1 ? user.timeType.customDataMaxValue : 'infinity'"></el-input-number>
@@ -1980,13 +1981,15 @@
                         }else{
                             if(this.user.timeType.type == 2){
                                 if(domains[i].startTime && domains[i].endTime){
-                                    let selectionTime = this.getHourMinutes(domains[i].startTime, domains[i].endTime)
+                                    // let selectionTime = this.getHourMinutes(domains[i].startTime, domains[i].endTime)
+                                    let selectionTime = this.getHour(domains[i].startTime, domains[i].endTime)
                                     let subtractedData = 0
                                     let arr = JSON.parse(JSON.stringify(this.vacationTime))
                                     arr.unshift({s: domains[i].startTime, e: domains[i].endTime})
                                     for(var j in arr) {
                                         subtractedData += +this.timeOverlap(j, arr)
                                     }
+                                    console.log(selectionTime, subtractedData)
                                     hours = +selectionTime - +subtractedData
                                     // hours += this.getHour(domains[i].startTime, domains[i].endTime)
                                 }
@@ -3302,11 +3305,36 @@
             updateSubProject() {
                 this.$forceUpdate();
             },
+            selectDegreeId(domain, index) {
+                this.http.post('/report/defaultDegree',{
+                    projectId: domain.projectId
+                },
+                res => {
+                    if (res.code == "ok") {
+                        if(res.data) {
+                            this.workForm.domains[index].degreeId = res.data.id + ''
+                            this.$forceUpdate();
+                        }
+                        
+                    } 
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                    }
+                );
+            },
             //项目选中了, 加载子项目
             selectProject(domain, index) {
                 if(!domain.projectId){
                     return;
                 }
+                // 默认选中上次填写的自定义维度
+                if(this.yonghuUser.customDegreeActive == 1) {
+                    this.selectDegreeId(domain, index)
+                }
                 // console.log('projectId===',domain.projectId);
                 domain.projectName = this.fillProjectList.filter(p=>p.id == domain.projectId)[0].projectName;
                 this.http.post('/sub-project/list',{
@@ -5092,7 +5120,8 @@
                             // var minutes=Math.floor(leave2/(60*1000))
                             // var shi = hours+'.'+ minutes
                             // he += +shi
-                            let selectionTime = this.getHourMinutes(zhi[i].time[0], zhi[i].time[1])
+                            // let selectionTime = this.getHourMinutes(zhi[i].time[0], zhi[i].time[1])
+                            let selectionTime = this.getHour(zhi[i].time[0], zhi[i].time[1])
                             let subtractedData = 0
                             // he += +this.getHour(zhi[i].time[0], zhi[i].time[1])
                             // 计算需要减去的时间
@@ -5121,7 +5150,8 @@
                         if (((dateAr[k].s <= dateAr[idx].s && dateAr[k].e >= dateAr[idx].s) || (dateAr[k].s <= dateAr[idx].s && dateAr[k].e <= dateAr[idx].e))) {
                             // 选择的时间包含设置的休息时间段 (选择的开始时间和结束时间大于设置的休息时间段)
                             if(dateAr[idx].s > dateAr[k].s && dateAr[idx].e < dateAr[k].e) {
-                                zhi += 2
+                                // zhi += 2
+                                zhi += +this.getHour(dateAr[idx].s, dateAr[idx].e)
                             }
                             // 选择的时间包含在设置的休息时间 (选择的开始时间和结束时间都处于在设置的休息时间段内)
                             if(dateAr[idx].s > dateAr[k].s && dateAr[idx].e > dateAr[k].e) {