Bläddra i källkod

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

seyason 2 år sedan
förälder
incheckning
4c02532148

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

@@ -1468,14 +1468,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 HSSFRow row = sheet.createRow(rowNum);
                 row.createCell(0).setCellValue(rowNum);
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    row.createCell(1).setCellValue("$userName="+item.getCorpwxUserid()+"$");
+                    row.createCell(1).setCellValue("$userName="+item.getCorpwxUserid()==null?"":item.getCorpwxUserid()+"$");
                 }else {
                     row.createCell(1).setCellValue(item.getName());
                 }
                 row.createCell(2).setCellValue(item.getRoleName());
                 row.createCell(3).setCellValue(item.getPhone());
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    row.createCell(4).setCellValue("departmentName="+item.getCorpwxDeptid()+"$");
+                    row.createCell(4).setCellValue("$departmentName="+item.getCorpwxDeptid()==null?"":item.getCorpwxDeptid()+"$");
                 }else {
                     row.createCell(4).setCellValue(item.getDepartmentName());
                 }

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

@@ -1390,5 +1390,8 @@
   "wanttodeletefirst": "Please select the record to delete first",
   "xuan-ze": "choose",
   "dui-yi-you-xiang-mu-jin-hang-xin-xi-geng-xin": "Update information on existing projects",
-  "dao-chu-qing-jia-dan": "Export leave request"
+  "dao-chu-qing-jia-dan": "Export leave request",
+  "suixiangmuzidongchuangjian": "Automatically created with project",
+  "ren-wu-lie-biao-ming-cheng": "task list name",
+  "yu-suan-gong-shi": "budgeted hours"
 }

+ 5 - 2
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -1234,7 +1234,7 @@
   "deletethegroup": "删除分组",
   "groupdetails": "分组详情",
   "shi-tu": "视图",
-  "renamingalist": "重命名列表",
+  "renamingalist": "修改列表",
   "jie-zhi": "截止",
   "ren-ling": "认领",
   "creatingTaskList": "新建任务列表",
@@ -1390,5 +1390,8 @@
   "li-run-shuai": "利润率(%)",
   "bai-fen-bi": "百分比",
   "dui-yi-you-xiang-mu-jin-hang-xin-xi-geng-xin": "对已有项目进行信息更新",
-  "dao-chu-qing-jia-dan": "导出请假单"
+  "dao-chu-qing-jia-dan": "导出请假单",
+  "suixiangmuzidongchuangjian": "随项目自动创建",
+  "ren-wu-lie-biao-ming-cheng": "任务列表名称",
+  "yu-suan-gong-shi": "预算工时"
 }

+ 21 - 18
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -204,7 +204,9 @@
             };
         },
         methods: {
-            echartsCurrentChange(){
+            echartsCurrentChange(val){
+                this.page = val
+                // console.log('CurrentChange');
                 if(this.radio == this.$t('ren-yuan')){
                     this.gtff()
                 }else{
@@ -269,10 +271,10 @@
                 },
             
             showExportDialog() {
-                console.log(12345)
+                // console.log(12345)
                 this.exportDialog = true;
                 this.exportParam.dateRange = this.dateRange;
-                console.log(this.hasReportUserList)
+                // console.log(this.hasReportUserList)
                 if (this.radio == this.$t('ren-yuan')) {
                     // this.exportParam.userIds = [];
                 }
@@ -309,7 +311,7 @@
                  var url = "/project/exportTimeCost";
                  var fileName = this.$t('projectmanhourcoststatistics')+ '.xls';
                  if (this.radio == this.$t('ren-yuan') ) {
-                     console.log(this.exportParam.userIds);
+                    //  console.log(this.exportParam.userIds);
                      fileName = this.$t('labortimecoststatistics')+ '.xls';
                      url = '/department/exportUserStatistic';
                      if (this.exportParam.userIds != null && this.exportParam.userIds.length > 0) {
@@ -409,9 +411,9 @@
             //获取人员成本统计列表
             getUserCostList() {
                 this.listLoading = true;
-                console.log(this.port.project.userCost, '获取人员成本统计列表')
-                console.log(this.user.timeType.fixMonthcost)
-                console.log(Boolean(this.dateRange))
+                // console.log(this.port.project.userCost, '获取人员成本统计列表')
+                // console.log(this.user.timeType.fixMonthcost)
+                // console.log(Boolean(this.dateRange))
                 let startDateNum = ''
                 let endDateNum = ''
                 if(this.dateRange) {
@@ -456,6 +458,7 @@
                 let data = this.allListData
                 var _this = this;
                 this.hasReportUserList = data.userList;
+                this.total = data.list.length
                 var xList = [] , yList = [] , list = data.list.slice(0+50*(this.page-1),49+50*(this.page-1)), array = [] , series = [];
                 var totalMoneyCost = data.totalCostMoney;
                 var totalHours = 0.0;
@@ -468,7 +471,7 @@
                 }
                 if (list.length > 0) {
                     var num = list.length==0?0:list[0].project.length;
-                    console.log('for 1');
+                    // console.log('for 1');
                     for(var i in list) {
                         xList.push(list[i].name);
                         var pro = list[i].project;
@@ -478,15 +481,15 @@
                             }
                         }
                     }
-                    console.log('for 2');
+                    // console.log('for 2');
                     for(var i in array) {
                         yList.push(array[i]);
                         var dataList = [];
-                        console.log('for 2 1');
+                        // console.log('for 2 1');
                         for(var j in list) {
                             var project = list[j].project , num = 0;
                             if(project.length != 0) {
-                                console.log('for 2 1 1');
+                                // console.log('for 2 1 1');
                                 for(var k in project) {
                                     if(project[k].project == array[i]) {
                                         let item = {
@@ -537,7 +540,7 @@
                     myChart.resize({
                         width: this.widthHtval
                     })
-                    console.log('设置宽度');
+                    // console.log('设置宽度');
                     // 设置宽度
                     _this.myChart = myChart;
                     var option = { 
@@ -622,11 +625,11 @@
                         }],
                         series: series,
                     };
-                    console.log('setoption');
+                    // console.log('setoption');
                     myChart.setOption(option,{notMerge:true});
             },
             yanjiu() {
-                console.log('触发')
+                // console.log('触发')
             },
             getEchart(e){
                 var that = this
@@ -734,7 +737,7 @@
                     // param.subCustomName = this.customName
                     param.customId = this.theCustomListId
                     param.fieldName = this.theCustomListPlant
-                    console.log(param, '要传的数据')
+                    // console.log(param, '要传的数据')
                 }
                 this.http.post(url, param,
                 res => {
@@ -924,7 +927,7 @@
                                         ((_this.permissions.countCost) ? _this.$t('workcost')+" : " + params[0].data.money 
                                         + _this.$t('yuan')+"<br/>" : '') + 
                                         ((_this.permissions.countHours) ? _this.$t('screening.workTime')+" : " + params[0].data.cost + _this.$t('time.hour') : '');
-                                        console.log(res, '将要渲染的数据')
+                                        // console.log(res, '将要渲染的数据')
                                         return res;
                                     }
                                     // trigger:'axis',
@@ -1013,7 +1016,7 @@
                         myChart.getZr().on('click', params => {
                             const pointInPixel = [params.offsetX, params.offsetY];
                             if (myChart.containPixel('grid', pointInPixel)) {
-                                console.log(_this.params)
+                                // console.log(_this.params)
                                 if(_this.radio==this.$t('other.project')) {
                                     if (_this.dateRange != null) {
                                         if (this.user.timeType.fixMonthcost == 0) {
@@ -1072,7 +1075,7 @@
             getZDY() {
                 this.http.post('/user-custom/getUserCustomTitle',{},res => {
                     if(res.code == 'ok'){
-                        console.log(res, '数据来源')
+                        // console.log(res, '数据来源')
                         this.theCustomList = res.data.result
                         this.theCustomListPlantLIst = res.data.field
                     }else {

+ 15 - 11
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -402,11 +402,11 @@
         <!--新增界面-->
         <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="960px">
             <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
-                <el-form-item :label="$t('Itemno')" >
+                <el-form-item :label="$t('Itemno')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <!-- <el-input v-model="addForm.code" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目编号" clearable></el-input> -->
                     <el-input v-model="addForm.code" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                 <el-form-item :label="$t('zhu-xiang-mu')" v-if="user.timeType.mainProjectState == '1'">
+                 <el-form-item :label="$t('zhu-xiang-mu')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.timeType.mainProjectState == '1'">
                     <!-- <el-select v-model="addForm.projectMainId" clearable :disabled="!permissions.projectManagement && addForm.creatorId != user.id" @change="projectManagementChange"> -->
                     <el-select v-model="addForm.projectMainId" clearable @change="projectManagementChange">
                         <el-option v-for="(item) in mainProjectList" :key="item.id" :value="item.id" :label="item.name + '\u3000' + item.code">
@@ -429,7 +429,7 @@
                     <!-- <el-input v-model="addForm.projectDesc" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目描述" clearable maxlength="4000"></el-input> -->
                     <el-input v-model="addForm.projectDesc" :placeholder="$t('peaseenterthe')" clearable maxlength="4000"></el-input>
                 </el-form-item>
-                <el-form-item :label="$t('projecttype')" prop="isPublic">
+                <el-form-item :label="$t('projecttype')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" prop="isPublic">
                     <!-- <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic" :disabled="!permissions.projectManagement && addForm.creatorId != user.id"> -->
                     <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic">
                         <el-option :value="0" :label="$t('commonproject')"></el-option>
@@ -446,7 +446,7 @@
                     </div>
                 </el-form-item>
 
-                <el-form-item :label="$t('subordinatedepartments')" v-if="user.timeType.projectWithDept">
+                <el-form-item :label="$t('subordinatedepartments')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.timeType.projectWithDept">
                     <el-cascader v-model="addForm.deptId" :options="departmentList" :placeholder="$t('defaultText.pleaseChoose')"
                         :props="{ checkStrictly: true, expandTrigger: 'hover' }" clearable filterable @change="cascaderChange" style="width: 100%"
                     ></el-cascader>
@@ -479,8 +479,9 @@
                         <el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item> -->
-                <el-form-item :label="$t('Allparticipants')" v-show="addForm.isPublic == 0">
+                <el-form-item :label="$t('Allparticipants')" v-show="addForm.isPublic == 0" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate != 1">
+
                         <div slot="content" style="width:780px">{{addForm.userNames}}</div>
                         <el-input  @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
                     </el-tooltip>
@@ -501,7 +502,7 @@
                         </div>
                     </el-tooltip>
                 </el-form-item>
-                <el-form-item :label="$t('projectmanager')">
+                <el-form-item :label="$t('projectmanager')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <!-- <el-select v-model="addForm.inchargerId"  :disabled="(addForm.userId.length==0 && addForm.isPublic == 0) || (!permissions.projectManagement && user.id != addForm.creatorId)" filterable placeholder="请选择项目经理" style="width:32%;" > -->
                     <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.inchargerId" filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" >
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
@@ -516,7 +517,7 @@
                     </el-select>
                 </el-form-item>
                 <!--专业项目协作版本功能 -->
-                <el-form-item :label="$t('ji-bie')" v-if="user.company.packageProject==1">
+                <el-form-item :label="$t('ji-bie')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.company.packageProject==1">
                     <el-select v-model="addForm.level"  :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" v-if="user.timeType.projectLevelState == 1">
                         <el-option v-for="item in levelList" :key="item.id" :label="item.projectLevelName" :value="item.id"></el-option>
                     </el-select>
@@ -562,7 +563,7 @@
 
                 <!-- 单个公司的固定字段 -->
                 <div v-if="user.companyId == '936'">
-                <el-form-item :label="$t('contractno')" >
+                <el-form-item :label="$t('contractno')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <el-input v-model="addForm.contractCode" maxlength="50" show-word-limit :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
                 <el-form-item :label="$t('warrantystartime')">
@@ -581,7 +582,7 @@
                      :clearable="false" type="date" 
                      placeholder="$t('optiondate')"></el-date-picker>
                 </el-form-item>
-                <el-form-item :label="$t('IndependentProject')" >
+                <el-form-item :label="$t('IndependentProject')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <!-- <el-input v-model="addForm.projectCategorySub" placeholder="请输入自主项目类别" clearable></el-input> -->
                     <el-select v-model="addForm.projectCategorySub" :placeholder="$t('defaultText.pleaseChoose')" clearable>
                         <el-option :value="$t('softwareproject')" :label="$t('softwareproject')"></el-option>
@@ -589,7 +590,7 @@
                         <el-option :value="$t('integrationproject')" :label="$t('integrationproject')"></el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item :label="$t('region')" >
+                <el-form-item :label="$t('region')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <el-input v-model="addForm.region" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
                 <el-form-item :label="$t('subordinateBU')" >
@@ -3051,7 +3052,7 @@ a {
                 });
             },
             importProjectBefore(){
-                this.paramData1 = true
+                this.paramData1 = false
                 this.importProjectBeforeDialog = true
             },
             importProject(item) {
@@ -4168,4 +4169,7 @@ a {
 .toolbar_formitem_n1{
     margin-right: 0 !important;
 }
+.wpgCssClass .el-form-item__label{
+    font-weight: 600;
+}
 </style>

+ 101 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -844,6 +844,9 @@
                         <el-row >
                             <el-col :span="22">
                                 <div><span>{{t.name}}</span>
+                                <el-link :underline="false" type="primary" style="color:#aaa;margin-left:10px;"
+                                 @click="setTemplate(t)"><i class="el-icon-setting" v-show="t.isSystem == 0" ></i>
+                                </el-link>
                                 <el-link :underline="false" type="primary" style="color:#aaa;margin-left:10px;"
                                  @click="deleteTemplate(t)"><i class="el-icon-delete" v-show="t.isSystem == 0" ></i>
                                 </el-link>
@@ -866,6 +869,23 @@
                 </el-tab-pane>
                 </el-tabs>
             </div>
+            <el-dialog title="编辑模板" append-to-body v-if="setTemplateDialog" :visible.sync="setTemplateDialog" width="500px">
+                <el-form label-width="20%">
+                    <el-form-item label="模板名称"><el-input v-model="setTemplateData.name" style="width:80%" clearable></el-input></el-form-item>
+                    <el-form-item label=""><el-checkbox v-model="setTemplateData.creWithPro">随项目自动创建</el-checkbox></el-form-item>
+                    <el-form-item v-for="item,index in setTemplateData.stagesList" :key="item.id" :label="index == 0 ? '任务列表' : ''">
+                        <el-input v-model="item.stagesName"  style="width:70%" clearable></el-input>
+                        <el-link :underline="false" type="primary" style="color:#aaa;" @click="deleteStages(item,index)"  v-if="index != 0">
+                            <i class="el-icon-delete"></i>
+                        </el-link>
+                    </el-form-item>
+                    <el-link style="margin-left:20%" :underline="false" type="primary" @click="addStages()">新增任务列表</el-link>
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button type="primary" @click="setTemplateDialog = false">取消</el-button>
+                    <el-button type="primary" @click="setTemplateSave()">{{ $t('save') }}</el-button>
+                </div>
+            </el-dialog>
         </el-dialog>
         <el-dialog :title="$t('taskgroupleader')" v-if="setInchargerDialog" :visible.sync="setInchargerDialog" :close-on-click-modal="false" customClass="customWidth" width="300px">
             <el-form ref="formIncharger" :model="groupForm" :rules="rules" style="margin-top:10px;">
@@ -906,6 +926,7 @@
                                 <el-checkbox v-model="templateForm.saveTask" :label="$t('other.task')"></el-checkbox>
                                 <el-checkbox v-model="templateForm.saveMileStone" :label="$t('other.milestone')"></el-checkbox>
                                 <el-checkbox v-model="templateForm.saveRisk" :label="$t('risk')"></el-checkbox>
+                                <el-checkbox v-model="templateForm.automatically" :label="$t('suixiangmuzidongchuangjian')"></el-checkbox>
                             </div>
                     </el-form-item>
             </el-form>
@@ -919,7 +940,15 @@
             <el-form ref="form2" :model="stageForm" :rules="rules2" >
                 <el-form-item prop="stagesName">
                     <el-input v-model="stageForm.stagesName" :placeholder="$t('pleaseenteratasklistname')" maxlength="60"
-                        show-word-limit clearable></el-input>
+                        show-word-limit clearable>
+                        <template slot="prepend">
+                            <div style="width:90px">{{ $t('ren-wu-lie-biao-ming-cheng') }}</div>
+                        </template></el-input>
+                    <el-input id="stageForm_ysgs" v-model="stageForm.stagesTime" style="margin-top:5px" @keyup.native="restrictNumber('stageForm_ysgs')">
+                        <template slot="prepend">
+                            <div style="width:90px">{{ $t('yu-suan-gong-shi') }}<span>(h)</span></div>
+                        </template>
+                    </el-input>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
@@ -1191,7 +1220,9 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
                 groupResponsibleId: '', // 分组负责人的id
                 groupDetailsShow: false,
                 groupDetailData: {},
-                groupDetailTil: ''
+                groupDetailTil: '',
+                setTemplateData: {},
+                setTemplateDialog: false
             };
             
         },
@@ -1201,7 +1232,16 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
             }
         },
         methods: {
-
+            restrictNumber(targetId) {
+                let inpu = document.getElementById(targetId)
+                inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
+                inpu.value = inpu.value.replace(/\.{2,}/g, "."); //两个连续的"."仅保留第一个"."
+                inpu.value = inpu.value.replace(".", "$#*").replace(/\./g,'').replace('$#*','.');//去除其他"."
+                inpu.value = inpu.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2');;//限制只能输入两个小数
+                if (inpu.value.indexOf(".") < 0 && inpu.value != "") { //首位是0的话去掉
+                    inpu.value = parseFloat(inpu.value);
+                }
+            },
             test(item){
                 // let pro = this.$route
                 console.log('test',this.projectList);
@@ -1651,6 +1691,63 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
                     );
                 
             },
+            // 编辑模板
+            setTemplate(t){
+                console.log(t);
+                this.setTemplateData = t
+                this.setTemplateData.needDelete = []
+                this.setTemplateDialog = true
+            },
+            setTemplateSave(){
+                if(this.setTemplateData.name == '' || this.setTemplateData.name == null){
+                    this.$message({
+                        message: '模板名称不能为空',
+                        type: 'error'
+                    })
+                    return
+                }
+                for(let i in this.setTemplateData.stagesList){
+                    if(this.setTemplateData.stagesList[i].stagesName == '' || this.setTemplateData.stagesList[i].stagesName == null){
+                        this.$message({
+                            message: '任务列表名称不能为空',
+                            type: 'error'
+                        })
+                        return
+                    }
+                }
+                this.http.post('/task-group/setTemplate',this.setTemplateData,
+                res => {
+                    if(res.code == 'ok'){
+                        this.$message({
+                            message: '修改成功',
+                            type: 'success'
+                        })
+                        this.getGroupTemplate()
+                        this.setTemplateDialog = false
+                    }else{
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+            deleteStages(item,index){
+                this.setTemplateData.needDelete.push(item.id)
+                this.setTemplateData.stagesList.splice(index,1)
+                console.log('deletestages',item.id);
+            },
+            addStages(){
+                this.setTemplateData.stagesList.push({
+                    stagesName: '',
+                    templateId: this.setTemplateData.id
+                })
+            },
             //删除模板
             deleteTemplate(t) {
                 var that = this;
@@ -2521,7 +2618,7 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
             },
             addStage() {
                 this.addStageDialog = true;
-                this.stageForm = {groupId: this.selectedGroup.id, projectId: this.curProjectId};
+                this.stageForm = {groupId: this.selectedGroup.id, projectId: this.curProjectId, stagesTime: 0};
             },
             viewChange(index, indexPath) {
                 this.groupType = 1;

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

@@ -173,7 +173,7 @@
                       <div v-if="user.userNameNeedTranslate == 1">
                         <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
                       </div>
-                      <div v-else>{{scope.row.name}}</div>
+                      <div v-else>{{scope.row.departmentName}}</div>
                     </div>
                   </template>
                 </el-table-column>