Browse Source

优化

master
陈裕财 4 years ago
parent
commit
cc8f0e8adf
  1. 4
      src/router/routes_xm.js
  2. 5
      src/views/xm/core/xmIteration/XmIterationInfo.vue
  3. 5
      src/views/xm/core/xmProduct/XmProductInfo.vue
  4. 537
      src/views/xm/core/xmProject/XmProjectAdd.vue
  5. 190
      src/views/xm/core/xmProject/XmProjectEdit.vue
  6. 4
      src/views/xm/core/xmProject/XmProjectForLinkComplex.vue
  7. 5
      src/views/xm/core/xmProject/XmProjectInfo.vue
  8. 6
      src/views/xm/core/xmProject/XmProjectMng.vue

4
src/router/routes_xm.js

@ -14,9 +14,7 @@ export default {
icon: 'project'
},
// leaf: true,//只有一个节点
children: [
{ path: 'xmProject/XmProjectAdd', component: _import('xm/core/xmProject/XmProjectAdd'), name: 'xmProjectAdd',hidden:true, meta: { title: '项目立项' }},
children: [
{ path: 'xmProject/XmProjectAllMng', component: _import('xm/core/xmProject/XmProjectAllMng'), name: 'xmProjectAllMng', meta: { title: '项目总览' }},
{ path: 'xmProject/XmProjectMng', component: _import('xm/core/xmProject/XmProjectMng'), name: 'xmProjectMng', meta: { title: '项目(我的)' }},
{ path: 'xmProjectState/XmProjectStateMng', component: _import('xm/core/xmProjectState/XmProjectStateMng'), name: 'XmProjectStateMng', meta: { title: '项目统计' }},

5
src/views/xm/core/xmIteration/XmIterationInfo.vue

@ -50,10 +50,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProject,editStatus , delXmProject, batchDelXmProject } from '@/api/xm/core/xmProject';
import XmProjectAdd from '../xmProject/XmProjectAdd';//
import XmProjectEdit from '../xmProject/XmProjectEdit';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex';
import xmTaskMng from '../xmTask/XmTaskMng';
import xmGroupMng from '../xmGroup/XmGroupMng';

5
src/views/xm/core/xmProduct/XmProductInfo.vue

@ -184,10 +184,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProject,editStatus , delXmProject, batchDelXmProject } from '@/api/xm/core/xmProject';
import XmProjectAdd from '../xmProject/XmProjectAdd';//
import XmProjectEdit from '../xmProject/XmProjectEdit';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import XmProjectForLinkComplex from '../xmProject/XmProjectForLinkComplex';//
import { mapGetters } from 'vuex';

537
src/views/xm/core/xmProject/XmProjectAdd.vue

@ -1,537 +0,0 @@
<template>
<section class="page-container padding border">
<el-row class="page-main " :style="{overflowX:'auto',height:maxTableHeight+'px'}" ref="table">
<!--编辑界面 XmProject xm_project-->
<el-form :model="addForm" label-width="120px" :rules="addFormRules" ref="addForm">
<el-form-item label="项目代号" prop="code">
<el-input v-model="addForm.code" placeholder="项目代号,不可为空" >
<template slot="append">
<el-button type="text" @click="createProjectCode">自动生成</el-button>
</template>
</el-input>
<font color="blue" style="font-size:10px;">项目代号为合同上的项目代号甲乙方共享;项目内部编号为 &nbsp;代号-四位随机码</font>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="addForm.name" placeholder="项目名称" ></el-input>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="项目类型" prop="xmType">
<el-select v-model="addForm.xmType">
<el-option v-for="(i,index) in dicts['projectType']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="优先级" prop="priority">
<el-select v-model="addForm.priority">
<el-option v-for="(i,index) in dicts['priority']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="预算控制">
<el-form-item prop="budgetCtrl">
<el-checkbox v-model="addForm.budgetCtrl" true-label="1" false-label="0" >总预算控制</el-checkbox>
<font style="font-size:12px;" color="blue">项目计划总预算不能大于项目总预算</font>
</el-form-item>
<el-form-item label="" prop="phaseBudgetCtrl">
<el-checkbox v-model="addForm.phaseBudgetCtrl" true-label="1" false-label="0" >项目计划预算控制</el-checkbox>
<font style="font-size:12px;" color="blue">下级计划总预算不能大于上级计划总预算每条计划的预算金额必须大于其关联任务的预算合计</font>
</el-form-item>
<el-form-item label="" prop="phaseActCtrl">
<el-checkbox v-model="addForm.phaseActCtrl" true-label="1" false-label="0" >实际金额控制</el-checkbox>
<font style="font-size:12px;" color="blue">每条计划实际金额不能大于预算金额;每条计划的预算金额必须大于其关联的任务的实际金额合计</font>
</el-form-item>
</el-form-item>
<el-row>
<el-col :span="8">
<el-form-item label="总控" prop="admUserid">
<el-input readonly v-model="addForm.admUsername" @click.native="showUserVisible('admUserid')"></el-input>
<font style="font-size:12px;" color="blue"></font>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目经理" prop="pmUserid">
<el-input readonly v-model="addForm.pmUsername" @click.native="showUserVisible('pmUserid')"></el-input>
<font style="font-size:12px;" color="blue"></font>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="副经理、助理" prop="assUserid">
<el-input readonly v-model="addForm.assUsername" @click.native="showUserVisible('assUserid')"></el-input>
<font style="font-size:12px;" color="blue"></font>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="项目预估" >
<el-tabs>
<el-tab-pane label="工作量及人力成本" name="planWorkload">
<el-row>
<el-date-picker
v-model="dateRanger"
class="hidden-sm-and-down"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="计划开始日期"
end-placeholder="计划完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00','23:59:59']"
:picker-options="pickerOptions"
></el-date-picker>
<el-input style="width:150px;" type="number" v-model="addForm.planWorkingHours" :precision="2" :step="8" :min="0" placeholder="预计工时"></el-input><el-tag>参考工时{{autoParams.planWorkingHours}}小时,工作日{{autoParams.weekday}}</el-tag>
</el-row>
<el-divider></el-divider>
<el-row>
<el-col :span="4">人员类型</el-col>
<el-col :span="4">人数</el-col>
<el-col :span="4">工作量</el-col>
<el-col :span="4">单价</el-col>
<el-col :span="8">总价</el-col>
</el-row>
<el-divider></el-divider>
<el-row>
<el-col :span="4">内购</el-col>
<el-col :span="4"><el-input style="width:120px;" type="number" v-model="addForm.planIuserCnt" :precision="0" :step="1" :min="0" placeholder="内购人数"></el-input>
</el-col>
<el-col :span="4">{{autoParams.planIuserWorkload}}人时</el-col>
<el-col :span="4"><el-input style="width:120px;" type="number" v-model="addForm.planIuserPrice" :precision="0" :step="1" :min="0" placeholder="预计内部人时单价"></el-input> </el-col>
<el-col :span="8">{{this.toFixed(autoParams.planIuserAt)}},{{this.toFixed(autoParams.planIuserAt/10000)}} 万元</el-col>
</el-row>
<el-divider></el-divider>
<el-row>
<el-col :span="4">外购</el-col>
<el-col :span="4"><el-input style="width:120px;" type="number" v-model="addForm.planOuserCnt" :precision="0" :step="1" :min="0" placeholder="外购人数"></el-input>
</el-col>
<el-col :span="4">{{autoParams.planOuserWorkload}}人时</el-col>
<el-col :span="4"><el-input style="width:120px;" type="number" v-model="addForm.planOuserPrice" :precision="0" :step="1" :min="0" placeholder="预计外购人时单价"></el-input> </el-col>
<el-col :span="4">{{autoParams.planOuserAt }} {{autoParams.planOuserAt/10000 }}万元</el-col>
</el-row>
<el-divider></el-divider>
<el-row>
<el-col :span="4">合计</el-col>
<el-col :span="4"> {{autoParams.planOuserCnt+autoParams.planIuserCnt}}
</el-col>
<el-col :span="4">{{autoParams.planOuserWorkload+autoParams.planIuserWorkload }}人时,{{ (autoParams.planOuserWorkload+autoParams.planIuserWorkload)/8/20 }}人月 </el-col>
<el-col :span="4">平均{{ (parseFloat2(autoParams.planOuserPrice) + parseFloat2(autoParams.planIuserPrice))/2}}/人时</el-col>
<el-col :span="8">{{autoParams.planTotalCost}} {{(autoParams.planTotalCost)/10000}} 万元</el-col>
</el-row>
</el-tab-pane>
<el-tab-pane label="成本总览" name="planTotalCost">
<el-row>
内购 <el-input style="width:120px;" type="number" v-model="addForm.planIuserAt" :precision="2" :step="1000" :min="0" placeholder="内部人力成本总预算"></el-input> <el-tag> {{this.toFixed(autoParams.planIuserAt/10000)}}万元</el-tag>
外购 <el-input style="width:120px;" type="number" v-model="addForm.planOuserAt" :precision="2" :step="1000" :min="0" placeholder="外购人力成本总预算"></el-input> <el-tag> {{this.toFixed(autoParams.planOuserAt/10000)}}万元</el-tag>
非人力<el-input style="width:120px;" type="number" v-model="addForm.planNouserAt" :precision="2" :step="1000" :min="0" placeholder="人力成本总预算"></el-input> <el-tag> {{this.toFixed( autoParams.planNouserAt/10000)}}万元</el-tag>
</el-row>
<el-divider></el-divider>
<el-row>
合计 <el-input style="width:150px;" type="number" v-model="addForm.planTotalCost" :precision="2" :step="1000" :min="0" placeholder="总成本预算"></el-input> <el-tag> {{this.toFixed(autoParams.planTotalCost/10000)}}万元</el-tag>
</el-row>
</el-tab-pane>
<el-tab-pane label="合同收入" name="contractAmt">
<el-row>
预计收款总额<el-input style="width:150px;" type="number" v-model="addForm.totalReceivables" :precision="2" :step="1000" :min="0" placeholder="预计总收款金额"></el-input> <el-tag> {{this.toFixed(autoParams.totalReceivables/10000)}}</el-tag>
合同总金额 <el-input style="width:150px;" type="number" v-model="addForm.contractAmt" :precision="2" :step="1000" :min="0" placeholder="合同总金额"></el-input> <el-tag> {{this.toFixed(autoParams.contractAmt/10000)}}</el-tag>
</el-row>
</el-tab-pane>
<el-tab-pane label="毛利水平" name="budgetTaxRate">
<el-row>
税率<el-input style="width:120px;" type="number" v-model="addForm.taxRate" :precision="2" :step="0.01" :min="0" :max="0.99" placeholder="税率"></el-input>
考核标准毛利率<el-input style="width:120px;" type="number" v-model="addForm.budgetMarginRate" :precision="2" :step="0.01" :min="0" :max="0.99" placeholder="毛利率"></el-input>
当前毛利率为<el-tag>{{toFixed(parseFloat2(autoParams.currentBudgetMarginRate)*100,2)}}%</el-tag>
</el-row>
</el-tab-pane>
</el-tabs>
</el-form-item>
<el-form-item label="项目描述" prop="description">
<el-input type="textarea" :rows="6" v-model="addForm.description" placeholder="项目描述" ></el-input>
</el-form-item>
</el-form>
</el-row>
<el-row>
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.add" type="primary" @click.native="addSubmit" :disabled="load.add==true">提交</el-button>
</el-row>
<el-drawer append-to-body title="选择员工" :visible.sync="userSelectVisible" size="60%">
<users-select isSingleUser=true @confirm="onUserSelected" ref="usersSelect"></users-select>
</el-drawer>
</section>
</template>
<script>
import util from '@/common/js/util';//
import {sn} from '@/common/js/sequence';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmProject,createProjectCode } from '@/api/xm/core/xmProject';
import { mapGetters } from 'vuex';
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
export default {
computed: {
...mapGetters([
'userInfo','roles'
]),
autoParams:function(){
var planOuserPrice=this.toFixed(this.addForm.planOuserPrice)
var planIuserPrice=this.toFixed(this.addForm.planIuserPrice)
var planOuserCnt=this.toFixed(this.addForm.planOuserCnt)
var planIuserCnt=this.toFixed(this.addForm.planIuserCnt)
var planWorkingHours=this.toFixed(this.addForm.planWorkingHours )
var planNouserAt=this.toFixed(this.addForm.planNouserAt )
var budgetMarginRate=this.toFixed(this.addForm.budgetMarginRate,4 )
var taxRate=this.toFixed(this.addForm.taxRate,4)
if(planOuserPrice==null || planOuserPrice==''){
planOuserPrice=100
}
if(planIuserPrice==null || planIuserPrice==''){
planIuserPrice=80
}
if(planOuserCnt==null || planOuserCnt==''){
planOuserCnt=0.0
}
if(planIuserCnt==null || planIuserCnt==''){
planIuserCnt=0.0
}
if(planNouserAt==null || planNouserAt==''){
planNouserAt=0.0
}
if(budgetMarginRate==null || budgetMarginRate==''){
budgetMarginRate=0.4
}
if(planWorkingHours==null || planWorkingHours==''){
planWorkingHours=0.0
}
if(taxRate==null || taxRate==''){
taxRate=0.03
}
var autoParams={
}
var weekday=1;
if(this.dateRanger!=null && this.dateRanger.length>=2 ){
weekday=this.getWeekday(new Date(this.dateRanger[0]),new Date(this.dateRanger[1]));
if(this.addForm.planWorkingHours==null || this.addForm.planWorkingHours=='' || this.addForm.planWorkingHours<=0){
planWorkingHours=weekday * 8
}
}
autoParams.weekday=weekday
autoParams.planWorkingHours=planWorkingHours
autoParams.planOuserPrice=planOuserPrice
autoParams.planIuserPrice=planIuserPrice
autoParams.planOuserCnt=planOuserCnt
autoParams.planIuserCnt=planIuserCnt
autoParams.taxRate=taxRate
autoParams.planIuserWorkload= planIuserCnt*planWorkingHours
autoParams.planOuserWorkload= planOuserCnt*planWorkingHours
autoParams.planWorkload= planIuserCnt*planWorkingHours + planOuserCnt*planWorkingHours
autoParams.planOuserAt= planOuserCnt * planWorkingHours * planOuserPrice
autoParams.planIuserAt= planIuserCnt * planWorkingHours * planIuserPrice
autoParams.planNouserAt= planNouserAt
autoParams.budgetMarginRate=budgetMarginRate
autoParams.planTotalCost= autoParams.planOuserAt + autoParams.planIuserAt + autoParams.planNouserAt
autoParams.totalReceivables=autoParams.planTotalCost/(1-budgetMarginRate)/ (1-taxRate)
autoParams.contractAmt =autoParams.totalReceivables
var totalReceivables=this.addForm.totalReceivables
if(totalReceivables==null || totalReceivables=='' || isNaN(totalReceivables)){
autoParams.currentBudgetMarginRate=-99
}else{
autoParams.currentBudgetMarginRate= this.toFixed(1-this.addForm.planTotalCost/(this.addForm.totalReceivables* (1-taxRate)),4)
}
// 1.=-/×100%=/×100%
// 2.=1/×100%
//totalReceivables=budgetMarginRate *
//budgetMarginRate=(totalReceivables* (1-taxRate)-planTotalCost)/totalReceivables* (1-taxRate)=1-planTotalCost/(totalReceivables* (1-taxRate))
//1-budgetMarginRate = planTotalCost/(totalReceivables* (1-taxRate))
// planTotalCost/(1-budgetMarginRate) =totalReceivables* (1-taxRate)
// totalReceivables=planTotalCost/(1-budgetMarginRate)/ (1-taxRate)
return autoParams
},
planTotalAt:function(){
return {
planOuserAt:this.addForm.planOuserAt,
planIuserAt:this.addForm.planIuserAt,
planNouserAt:this.addForm.planNouserAt,
}
},
totalReceivables:function(){
return this.addForm.totalReceivables
}
},
props:['visible','xmProduct'],
watch: {
'visible':function(visible) {
if(visible==true){
}
},
'planTotalAt':{
handler(planTotalAt){
this.addForm.planTotalCost=this.toFixed(this.parseFloat2(planTotalAt.planOuserAt)+this.parseFloat2(planTotalAt.planIuserAt)+this.parseFloat2(planTotalAt.planNouserAt))
//this.addForm.totalReceivables=this.toFixed(this.parseFloat2(this.addForm.planTotalCost) * (1+0.3))
},
deep:true
},
'totalReceivables':function(){
//this.addForm.budgetMarginRate=this.toFixed((this.addForm.totalReceivables-this.addForm.planTotalCost)/this.addForm.totalReceivables,4)
},
autoParams(){
this.fillPlanWorkingHoursToField()
this.fillPlanCostAtToField();
this.fillTotalReceivablesToField();
this.fillBudgetMarginRateToField()
},
},
data() {
const beginDate = new Date();
const endDate = new Date();
endDate.setTime(beginDate.getTime() + 3600 * 1000 * 24 * 7 * 4);
return {
filters: {
ids: [],
},
dicts:{
projectType:[],
priority:[],
priority:[],
projectStatus:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, add: false, del: false, edit: false },//...
addFormRules: {
name: [{
required: true, message: '项目名称不可为空' , trigger: 'change'
}],
code: [{
required: true, message: '项目代号不可为空', trigger: 'change'
}],
xmType: [{
required: true, message: '项目类型不可为空', trigger: 'change'
}],
priority: [{
required: true, message: '优先级不可为空', trigger: 'change'
}],
admUserid: [{
required: true, message: '项目总控不能为空', trigger: 'change'
}],
pmUserid: [{
required: true, message: '项目经理不能为空', trigger: 'change'
}],
},
// XmProject xm_project
addForm: {
id:'',code:'',name:'',xmType:'',startTime:'',endTime:'',urgent:'',priority:'',description:'',createUserid:'',createUsername:'',createTime:'',assess:'',assessRemarks:'',status:'',branchId:'',planTotalCost:0,bizProcInstId:'',bizFlowState:'',taxRate:0.06,planNouserAt:0,planIuserAt:0,planOuserAt:0,locked:'',baseTime:'',baseRemark:'',baselineId:'',planWorkload:0,totalReceivables:0,budgetMarginRate:0.13,contractAmt:0,planIuserPrice:85,planOuserPrice:100,planOuserCnt:1,planIuserCnt:1,planWorkingHours:0,planIuserWorkload:0,planOuserWorkload:0,budgetCtrl:'0',admUserid:'',admUsername:'',pmUserid:'',pmUsername:'',assUserid:'',assUsername:''
},
/**begin 在下面加自定义属性,记得补上面的一个逗号**/
xmGroups:[],
userSelectType: "",
userSelectVisible: false,
groupSelectVisible:false,
/**begin 在下面加自定义属性,记得补上面的一个逗号**/
dateRanger: [ ],
pickerOptions: util.pickerOptions('datarange'),
currUserType:'',
userSelectVisible:false,
maxTableHeight:300,
/**end 在上面加自定义属性**/
}//end return
},//end data
methods: {
//
//
showProjectGroups:function(){
this.groupSelectVisible=true;
},
//
onGroupSelected(groups){
this.xmGroups=groups;
this.groupSelectVisible=false;
},
// @cancel="addFormVisible=false"
handleCancel:function(){
this.$emit('cancel');
},
//XmProject xm_project@submit="afterEditSubmit"
addSubmit: function () {
if (
this.dateRanger != null &&
this.dateRanger.length == 2
) {
this.addForm.startTime = this.dateRanger[0]
this.addForm.endTime = this.dateRanger[1]
}else{
this.$notify({showClose: true, message: "请输入开始日期和结束日期", type: 'error' });
return;
}
this.$refs.addForm.validate((valid) => {
if (valid) {
var msg=this.xmProduct&&this.xmProduct.id?'将自动关联产品【'+this.xmProduct.productName+'】':'';
this.$confirm('确认提交吗?'+msg, '提示', {}).then(() => {
this.load.add=true
let params = Object.assign({}, this.addForm);
if(this.xmProduct && this.xmProduct.id){
params.links=[{productId:this.xmProduct.id}]
}
params.planIuserWorkload=this.autoParams.planIuserWorkload
params.planOuserWorkload=this.autoParams.planOuserWorkload
params.planWorkload=this.autoParams.planWorkload
addXmProject(params).then((res) => {
this.load.add=false;
var tips=res.data.tips;
if(tips.isOk){
this.$emit('submit',res.data.data);// @submit="afterEditSubmit"
}
this.$notify({showClose: true, message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err =>this.load.add=false);
});
}else{
this.$notify({showClose: true, message: "表单检查不通过,请修改后提交", type:'error'});
}
});
},
getWeekday(first, last) {
//getDay()
//firstlast()
first = first.getTime();
last = last.getTime();
var count = 0;
for (var i = first; i <= last; i += 24 * 3600 * 1000) {
var d = new Date(i);
if (d.getDay() >= 1 && d.getDay() <= 5) {
count++;
}
}
return count;
},
toFixed(floatValue,num){
if(floatValue ==null || floatValue=='' || floatValue == undefined){
return 0;
}else{
if(!num){
num=2
}
return parseFloat(parseFloat(floatValue).toFixed(num));
}
},
parseFloat2(floatValue){
if(floatValue ==null || floatValue=='' || floatValue == undefined){
return 0;
}else{
return parseFloat(floatValue);
}
},
fillToField:function(){
this.addForm=Object.assign(this.addForm,this.autoParams);
},
fillPlanWorkingHoursToField:function(){
this.addForm.planWorkingHours=this.toFixed(this.autoParams.planWorkingHours)
},
fillPlanCostAtToField:function(){
this.addForm.planNouserAt=this.toFixed(this.autoParams.planNouserAt)
this.addForm.planOuserAt=this.toFixed(this.autoParams.planOuserAt )
this.addForm.planIuserAt=this.toFixed(this.autoParams.planIuserAt )
this.addForm.planTotalCost=this.toFixed(this.autoParams.planTotalCost)
},
fillTotalReceivablesToField:function(){
this.addForm.totalReceivables=this.toFixed(this.autoParams.totalReceivables )
this.addForm.contractAmt=this.toFixed(this.autoParams.contractAmt )
},
fillBudgetMarginRateToField:function(){
this.addForm.budgetMarginRate=this.toFixed(this.autoParams.budgetMarginRate,4)
},
createProjectCode(){
createProjectCode({}).then(res=>{
var tips=res.data.tips;
if(tips.isOk){
this.addForm.code=res.data.data
}
this.$notify({showClose: true, message: tips.msg, type: tips.isOk?'success':'error' });
})
},
showUserVisible(userType){
this.currUserType=userType
this.userSelectVisible=true;
},
//
onUserSelected: function(users) {
this.userSelectVisible = false;
var user={userid:'',username:''};
if(users && users.length>0){
user=users[0]
}
if(this.currUserType=='admUserid'){
this.addForm.admUserid=user.userid
this.addForm.admUsername=user.username
}else if(this.currUserType=='assUserid'){
this.addForm.assUserid=user.userid
this.addForm.assUsername=user.username
}else if(this.currUserType=='pmUserid'){
this.addForm.pmUserid=user.userid
this.addForm.pmUsername=user.username
}
this.currUserType="";
},
/**end 在上面加自定义方法**/
},//end method
components: {
UsersSelect,
},
mounted() {
this.maxTableHeight=util.calcTableMaxHeight(this.$refs.table.$el);
this.addForm.pmUserid=this.userInfo.userid
this.addForm.pmUsername=this.userInfo.username
this.addForm.admUserid=this.userInfo.userid
this.addForm.admUsername=this.userInfo.username
this.addForm.assUserid=this.userInfo.userid
this.addForm.assUsername=this.userInfo.username
initSimpleDicts('all',['projectType','priority','projectStatus']).then(res=>{
this.dicts=res.data.data;
})
}
}
</script>
<style scoped>
.line{
float:right;
width: 100%;
height: 1px;
margin-top: -0.5em;
background:#d4c4c4;
position: relative;
text-align: center;
}
</style>

190
src/views/xm/core/xmProject/XmProjectEdit.vue

@ -14,22 +14,59 @@
<el-collapse value="1" accordion>
<el-collapse-item title="基本信息" name="1">
<el-form-item label="项目代号|名称" prop="name">
<el-form-item label="项目代号" prop="code" v-if="opType==='add'">
<el-input v-model="editForm.code" placeholder="项目代号,不可为空" >
<template slot="append">
<el-button type="text" @click.native="createProjectCode">自动生成</el-button>
</template>
</el-input>
<font color="blue" style="font-size:10px;">项目代号为合同上的项目代号甲乙方共享;项目内部编号为 &nbsp;代号-四位随机码</font>
</el-form-item>
<el-form-item label="名称" prop="name" v-if="opType==='add'">
<el-input v-model="editForm.name" placeholder="项目名称" ></el-input>
</el-form-item>
<el-form-item label="项目代号|名称" prop="name" v-if="opType!=='add'">
<el-input v-model="editForm.code" placeholder="项目代号,不可为空" style="width:20%;" ></el-input><el-input style="width:80%;" v-model="editForm.name" placeholder="" ></el-input>
<font color="blue" style="font-size:10px;">项目代号为合同上的项目代号甲乙方共享;项目内部编号为 &nbsp;代号-四位随机码</font>
</el-form-item>
<el-form-item label="项目属性" prop="xmType">
<el-select v-model="editForm.xmType">
<el-option v-for="(i,index) in dicts['projectType']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
<el-select v-model="editForm.priority">
<el-option v-for="(i,index) in dicts['priority']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="项目类型" prop="xmType">
<el-select v-model="editForm.xmType">
<el-option v-for="(i,index) in dicts['projectType']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="优先级别" prop="priority">
<el-select v-model="editForm.priority">
<el-option v-for="(i,index) in dicts['priority']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="工作方式" prop="workType">
<el-radio label="1" v-model="editForm.workType">scrum</el-radio>
<el-radio label="2" v-model="editForm.workType">看板</el-radio>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报工方式" prop="wtype">
<el-select v-model="editForm.wtype">
<el-option label="无须报工" value="0" ></el-option>
<el-option label="每日报工" value="1" ></el-option>
<el-option label="工期内任意日报工" value="2" ></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="总控" prop="admUserid">
<el-form-item label="项目总控" prop="admUserid">
<el-input readonly v-model="editForm.admUsername" @click.native="showUserVisible('admUserid')"></el-input>
<font style="font-size:12px;" color="blue"></font>
</el-form-item>
@ -67,7 +104,7 @@
</el-form-item>
</el-form-item>
</el-collapse-item>
<el-collapse-item title="工期及成本预估" name="3">
<el-collapse-item title="工期" name="3">
<el-form-item label="" >
<el-row>
<el-date-picker
@ -85,8 +122,11 @@
></el-date-picker>
<el-input style="width:150px;" type="number" v-model="editForm.planWorkingHours" :precision="2" :step="8" :min="0" placeholder="预计工时"></el-input>小时 &nbsp;&nbsp;<el-tag>参考工时{{autoParams.weekday*8}}小时,工作日{{autoParams.weekday}}</el-tag>
</el-row>
<el-divider></el-divider>
</el-row>
</el-form-item>
</el-collapse-item>
<el-collapse-item title="成本预估" name="4">
<el-form-item label="" >
<el-row>
<el-col :span="4">人员类型</el-col>
<el-col :span="4">人数</el-col>
@ -134,32 +174,35 @@
<el-row>
合计 <el-input style="width:150px;" disabled type="number" v-model="editForm.planTotalCost" :precision="2" :step="1000" :min="0" placeholder="总成本预算"></el-input> <el-tag> {{this.toFixed(autoParams.planTotalCost/10000)}}万元</el-tag>
</el-row>
</el-form-item>
<el-form-item label="收入及盈利水平预估">
<el-row>
预计收款总额<el-input style="width:150px;" type="number" v-model="editForm.totalReceivables" :precision="2" :step="1000" :min="0" disabled placeholder="预计总收款金额"></el-input> <el-tag> {{this.toFixed(autoParams.totalReceivables/10000)}}万元</el-tag>
合同总金额 <el-input style="width:150px;" type="number" v-model="editForm.contractAmt" :precision="2" :step="1000" :min="0" placeholder="合同总金额"></el-input> <el-tag>{{this.toFixed(autoParams.contractAmt/10000)}}万元</el-tag>
</el-row>
<el-row>
税率<el-input style="width:150px;" type="number" v-model="editForm.taxRate" :precision="2" :step="0.01" :min="0" :max="0.99" placeholder="税率"></el-input>
考核标准毛利率<el-input style="width:150px;" type="number" v-model="editForm.budgetMarginRate" :precision="2" :step="0.01" :min="0" :max="0.99" placeholder="毛利率"></el-input>
当前毛利率为<el-tag>{{toFixed(parseFloat2(autoParams.currentBudgetMarginRate)*100,2)}}%</el-tag>
</el-row>
</el-form-item>
</el-form-item>
</el-collapse-item>
<el-collapse-item title="收入及盈利水平" name="5">
<el-form-item label="">
<el-row>
税率<el-input style="width:150px;" type="number" v-model="editForm.taxRate" :precision="2" :step="5" :min="0" :max="100" placeholder="税率"></el-input> %
考核标准毛利率<el-input style="width:150px;" type="number" v-model="editForm.budgetMarginRate" :precision="2" :step="5" :min="0" :max="100" placeholder="毛利率"></el-input>%
当前预估毛利率为<el-tag>{{toFixed(parseFloat2(autoParams.currentBudgetMarginRate),2)}}%</el-tag>
</el-row>
<el-row>
预计收\付款总额<el-input style="width:150px;" type="number" v-model="editForm.totalReceivables" :precision="2" :step="1000" :min="0" disabled placeholder="预计总收款金额"></el-input> <el-tag> {{this.toFixed(autoParams.totalReceivables/10000)}}万元</el-tag>
合同总金额 <el-input style="width:150px;" type="number" v-model="editForm.contractAmt" :precision="2" :step="1000" :min="0" placeholder="合同总金额"></el-input> <el-tag>{{this.toFixed(editForm.contractAmt/10000)}}万元</el-tag>
</el-row>
</el-form-item>
</el-collapse-item>
</el-collapse>
</el-form>
</el-row>
<el-row>
<el-button v-loading="load.edit" type="primary" @click.native="editSubmit" :disabled="load.edit==true">提交</el-button>
<el-button icon="el-icon-watch" type="danger" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_baseinfo_change_approva'})">基本信息修改申请</el-button>
<el-button icon="el-icon-watch" type="danger" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_delay_approva'})">延期申请</el-button>
<el-button icon="el-icon-star-on" type="success" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_start_approva'})">立项申请</el-button>
<el-button icon="el-icon-success" type="success" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_over_approva'})">结项申请</el-button>
<el-button icon="el-icon-edit" type="warning" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_budget_change_approva'})">预算变更申请</el-button>
<el-button icon="el-icon-video-pause" type="danger" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_pause_approva'})">项目暂停申请</el-button>
<el-button icon="el-icon-video-play" type="primary" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_restart_approva'})">项目重新启动申请</el-button>
<span v-if="opType==='edit'" style="float:right;">
<el-button icon="el-icon-watch" type="danger" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_baseinfo_change_approva'})">基本信息修改申请</el-button>
<el-button icon="el-icon-watch" type="danger" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_delay_approva'})">延期申请</el-button>
<el-button icon="el-icon-star-on" type="success" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_start_approva'})">立项申请</el-button>
<el-button icon="el-icon-success" type="success" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_over_approva'})">结项申请</el-button>
<el-button icon="el-icon-edit" type="warning" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_budget_change_approva'})">预算变更申请</el-button>
<el-button icon="el-icon-video-pause" type="danger" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_pause_approva'})">项目暂停申请</el-button>
<el-button icon="el-icon-video-play" type="primary" @click="handleCommand({type:'sendToProcessApprova',data:editForm,bizKey:'xm_project_restart_approva'})">项目重新启动申请</el-button>
</span>
</el-row>
<el-drawer append-to-body title="选择员工" :visible.sync="userSelectVisible" size="60%">
@ -175,7 +218,7 @@
import config from "@/common/config"; //
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmProject,getDefOptions } from '@/api/xm/core/xmProject';
import { addXmProject,editXmProject,getDefOptions,createProjectCode } from '@/api/xm/core/xmProject';
import { uploadBase64 } from '@/api/mdp/arc/image';
import { mapGetters } from 'vuex';
@ -297,12 +340,11 @@
}
},
},
props:['selProject','visible'],
props:['selProject','visible','xmProject','opType'/**add、edit */],
watch: {
'visible':function(visible) {
if(visible==true){
this.editForm=Object.assign({},this.selProject)
this.dateRanger=[this.editForm.startTime,this.editForm.endTime]
this.initData();
}
},
'planTotalAt':{
@ -324,6 +366,9 @@
editForm:{
handler(newValue, oldValue) {
if(this.opType==='add'){
return;
}
this.$notify.closeAll();
this.changeTips=[];
if(this.selProject.planWorkingHours!=this.editForm.planWorkingHours){
@ -377,17 +422,20 @@
load:{ list: false, add: false, del: false, edit: false },//...
editFormRules: {
name: [{
required: true, message: '项目名称不可为空' , trigger: 'blur'
required: true, message: '项目名称不可为空' , trigger: 'change'
}],
code: [{
required: true, message: '项目代号不可为空', trigger: 'blur'
required: true, message: '项目代号不可为空', trigger: 'change'
}],
xmType: [{
required: true, message: '项目类型不可为空', trigger: 'blur'
required: true, message: '项目类型不可为空', trigger: 'change'
}],
xmType: [{
required: true, message: '项目类型不可为空', trigger: 'change'
}],
priority: [{
required: true, message: '优先级不可为空', trigger: 'blur'
required: true, message: '优先级不可为空', trigger: 'change'
}],
admUserid: [{
required: true, message: '项目总控不能为空', trigger: 'change'
@ -435,15 +483,12 @@
this.$emit('cancel');
},
//XmProject xm_project@submit="afterEditSubmit"
editSubmit: function () {
if(!this.roles.some(i=>i.roleid=='projectAdmin')){
this.$notify({showClose: true, message: "只有项目经理可以修改项目", type: 'error' });
return;
}
if("0" != this.selProject.status){
editSubmit: function () {
if(this.opType!=='add' && "0" != this.selProject.status){
this.$notify({showClose: true, message: "只有初始状态的项目可以修改,如确实需要修改,请进行项目变更审批", type: 'error' });
return;
}
var msg=this.xmProduct&&this.xmProduct.id?'将自动关联产品【'+this.xmProduct.productName+'】':'';
if (
this.dateRanger != null &&
this.dateRanger.length == 2
@ -456,13 +501,17 @@
}
this.$refs.editForm.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.$confirm('确认提交吗?'+msg, '提示', {}).then(() => {
this.load.edit=true
var func=editXmProject;
if(this.opType==='add'){
func=addXmProject;
}
let params = Object.assign({}, this.editForm);
params.planIuserWorkload=this.autoParams.planIuserWorkload
params.planOuserWorkload=this.autoParams.planOuserWorkload
params.planWorkload=this.autoParams.planWorkload
editXmProject(params).then((res) => {
func(params).then((res) => {
this.load.edit=false;
var tips=res.data.tips;
if(tips.isOk){
@ -729,17 +778,50 @@
},
createProjectCode(){
createProjectCode({}).then(res=>{
var tips=res.data.tips;
if(tips.isOk){
this.editForm.code=res.data.data
}
this.$notify({showClose: true, message: tips.msg, type: tips.isOk?'success':'error' });
})
},
initData(){
this.editForm={...this.selProject}
if(this.opType==='add'){
this.editForm.pmUserid=this.userInfo.userid
this.editForm.pmUsername=this.userInfo.username
this.editForm.admUserid=this.userInfo.userid
this.editForm.admUsername=this.userInfo.username
this.editForm.assUserid=this.userInfo.userid
this.editForm.assUsername=this.userInfo.username
this.editForm.status="0"
this.editForm.wtype=this.editForm.wtype||"2"
this.editForm.workType=this.editForm.workType||"1"
this.editForm.xmType=this.editForm.xmType||"2"
this.editForm.priority=this.editForm.priority||"2"
this.editForm.locked=this.editForm.locked||"0"
this.editForm.showOut=this.editForm.showOut||"2"
this.editForm.isTpl=this.editForm.isTpl||"0"
this.editForm.phaseActCtrl=this.editForm.phaseActCtrl||"1";
this.editForm.budgetEarly=this.editForm.budgetEarly||"1";
this.editForm.earlyAmt=this.editForm.earlyAmt||-10000;
this.editForm.budgetCtrl=this.editForm.budgetCtrl||"0";
this.editForm.taxRate=this.editForm.taxRate||6
this.editForm.budgetMarginRate=this.editForm.budgetMarginRate||13
}else{
this.dateRanger=[this.editForm.startTime,this.editForm.endTime]
}
}
/**end 在上面加自定义方法**/
},//end method
components: { html2canvas,UsersSelect,
// 'xm-project-add':XmProjectEdit
},
mounted() {
this.maxTableHeight=util.calcTableMaxHeight(this.$refs.table.$el)-20;
this.editForm=Object.assign({},this.selProject);
this.dateRanger=[this.editForm.startTime,this.editForm.endTime]
this.maxTableHeight=util.calcTableMaxHeight(this.$refs.table.$el)-20;
this.initData();
initSimpleDicts('all',['projectType','priority','projectStatus']).then(res=>{
this.dicts=res.data.data;
})

4
src/views/xm/core/xmProject/XmProjectForLinkComplex.vue

@ -17,7 +17,7 @@
v-model="projectAddVisible"
trigger="manual">
<xm-project-add :visible="projectAddVisible" :xm-product="xmProduct" @cancel="projectAddVisible=false" @submit="afterProjectAddSubmit"></xm-project-add>
<xm-project-add :visible="projectAddVisible" op-type="add" :xm-product="xmProduct" @cancel="projectAddVisible=false" @submit="afterProjectAddSubmit"></xm-project-add>
<el-link type="warning" slot="reference" @click="projectAddVisible=true" icon="el-icon-plus"><font style="font-size:14px;">项目</font></el-link>
</el-popover>
@ -75,7 +75,7 @@ import XmProductSelect from '@/views/xm/core/components/XmProductSelect.vue'
import XmProductProjectForLink from '../xmProduct/XmProductProjectForLink.vue';
import XmProjectOverview from "./XmProjectOverview";
import XmProjectAdd from './XmProjectAdd';//
import XmProjectAdd from './XmProjectEdit';//
import XmProjectDetail from './XmProjectDetail';//
import XmProductProjectLinkMng from '../xmProductProjectLink/XmProductProjectLinkMng.vue';

5
src/views/xm/core/xmProject/XmProjectInfo.vue

@ -161,10 +161,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProject,editStatus , delXmProject, batchDelXmProject } from '@/api/xm/core/xmProject';
import XmProjectAdd from './XmProjectAdd';//
import XmProjectEdit from './XmProjectEdit';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex';
import xmTaskMng from '../xmTask/XmTaskMng';
import xmGroupMng from '../xmGroup/XmGroupMng';

6
src/views/xm/core/xmProject/XmProjectMng.vue

@ -256,10 +256,10 @@
</el-row>
<el-drawer title="项目新增" :visible.sync="addFormVisible" :with-header="false" size="60%" :close-on-click-modal="false" append-to-body>
<xm-project-add :sel-project="addForm" :visible="addFormVisible" @cancel="addFormVisible=false" @submit="afterAddSubmit"></xm-project-add>
<xm-project-add :sel-project="addForm" op-type="add" :visible="addFormVisible" @cancel="addFormVisible=false" @submit="afterAddSubmit"></xm-project-add>
</el-drawer>
<el-drawer title="项目编辑" :visible.sync="editFormVisible" :with-header="false" size="60%" :close-on-click-modal="false" append-to-body>
<xm-project-edit :sel-project="editForm" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-project-edit>
<xm-project-edit :sel-project="editForm" op-type="edit" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-project-edit>
</el-drawer>
<el-drawer :title="selectProject==null?'项目明细':selectProject.name" center :fullscreen="true" :visible.sync="showInfo" size="50%" :close-on-click-modal="false" append-to-body>
<xm-project-info :sel-project="selectProject" :visible="showInfo" @changeShowInfo="changeShowInfo" @submit="changeShowInfo"></xm-project-info>
@ -323,7 +323,7 @@
import { loadTasksToXmProjectState , loadTasksSettleToXmProjectState} from '@/api/xm/core/xmProjectState';
import { addXmMyFocus , delXmMyFocus } from '@/api/xm/core/xmMyFocus';
import XmProjectAdd from './XmProjectAdd';//
import XmProjectAdd from './XmProjectEdit';//
import XmProjectEdit from './XmProjectEdit';//
import { mapGetters } from 'vuex'
import xmTaskMng from '../xmTask/XmTaskMng';

Loading…
Cancel
Save