projectApproval.vue 68 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396
  1. <template>
  2. <section>
  3. <!--工具条 top-->
  4. <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
  5. <el-form :inline="true">
  6. <el-form-item >
  7. <!-- <div style="display: flex;align-items: center;height: 40px;"> -->
  8. <div v-if="true" style="display: flex;align-items: center;height: 40px;">
  9. <el-input v-model="keyword" class="input-with-select" :placeholder="searchField == '1' ? $t('peaseenterthe') : $t('peaseenterthe')" clearable="true" size="small">
  10. <el-select v-model="searchField" style="width:120px;" slot="prepend" :placeholder="$t('defaultText.pleaseChoose')">
  11. <el-option :label="$t('headerTop.projectName')" value=1 ></el-option>
  12. <el-option :label="$t('Itemno')" value=2 ></el-option>
  13. </el-select>
  14. <el-button slot="append" @click="searchList" icon="el-icon-search"></el-button>
  15. </el-input>
  16. </div>
  17. </el-form-item>
  18. <!-- 分类筛选 -->
  19. <el-form-item >
  20. <span style="margin-left:5px;margin-right:5px;color:#606266;">{{ $t('fen-lei') }}</span>
  21. <el-select v-model="statusClf" style="width:140px;" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="searchClfList" size="small">
  22. <el-option v-for="item in baseClfList" :key="item.id" :label="item.name" :value="item.id" ></el-option>
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item style="float:right;">
  26. <el-link type="primary" :underline="false" @click="handleAdd(-1,null)">{{'新增'}}</el-link>
  27. <el-link type="primary" v-if="permissions.projectApprovalEdit||permissions.projectApprocalImport" style="margin-right:10px;" :underline="false" @click="importDialog=true">{{'导入'}}</el-link>
  28. <el-link type="primary" v-if="permissions.projectApprovalEdit||permissions.projectApprocalExport" style="margin-right:10px;" :underline="false" @click="exportData()">{{'导出'}}</el-link>
  29. </el-form-item>
  30. </el-form>
  31. </el-col>
  32. <div style="display: flex;width: 100%;">
  33. <div class="classification">
  34. <div>
  35. <p :class="idx == 0 ? 'on' : ''" @click="switchs(0)" v-if="permissions.projectApprovalEdit">{{'全部项目'}}</p>
  36. <p :class="idx == 1 ? 'on' : ''" @click="switchs(1)">{{'我发起的'}}</p>
  37. <!-- <p :class="idx == 2 ? 'on' : ''" @click="switchs(2)">{{'我审核的'}}</p> -->
  38. </div>
  39. </div>
  40. <div style="max-width: 94%;min-width: 90%">
  41. <el-table ref="projectlistOfWudulist" border @cell-mouse-enter="hoverCall" @cell-mouse-leave="handCall" :cell-class-name="tableCellClassName" :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;" @selection-change="checkedWudulist">
  42. <el-table-column type="selection" width="60" :selectable="isSelectable">
  43. </el-table-column>
  44. <el-table-column prop="projectCode" :label="$t('Itemno')" width="150"></el-table-column>
  45. <el-table-column prop="projectName" :label="$t('headerTop.projectName')" min-width="250" sortable="custom">
  46. <template slot-scope="scope">
  47. <div>
  48. <el-button type="text" v-if="scope.row.isPublic==0" @click="showProjectApprovalDeatil(scope.row)">{{scope.row.projectName}}</el-button>
  49. <span v-else>{{scope.row.projectName}}</span>
  50. </div>
  51. </template>
  52. </el-table-column>
  53. <el-table-column prop="categoryName" :label="$t('projectclassification')" width="140"></el-table-column>
  54. <el-table-column prop="isPublic" :label="'项目类型'" width="140">
  55. <template slot-scope="scope">{{scope.row.isPublic==0?"正式项目":"非项目"}}</template>
  56. </el-table-column>
  57. <el-table-column prop="inchargerName" :label="$t('projectmanager')" min-width="150">
  58. <template slot-scope="scope">
  59. <el-link type="primary" :underline="false" @click="showUser(scope.row.inchargerId)">
  60. <span v-if="user.userNameNeedTranslate != 1">
  61. {{scope.row.inchargerName}}
  62. </span>
  63. <span v-if="user.userNameNeedTranslate == 1">
  64. <ww-open-data type='userName' :openid='scope.row.inchargerName'></ww-open-data>
  65. </span>
  66. </el-link>
  67. </template>
  68. </el-table-column>
  69. <!-- 级别 -->
  70. <el-table-column :prop="user.timeType.projectLevelState == 1 ? 'levelName' : 'level'" :label="$t('ji-bie')" min-width="190" v-if="user.company.packageProject == 1">
  71. <template slot-scope="scope">
  72. <span v-if="user.timeType.projectLevelState == 1">{{scope.row.levelName}}</span>
  73. <span v-else>{{importanceListLable[scope.row.level - 1]}}</span>
  74. </template>
  75. </el-table-column>
  76. <el-table-column prop="status" :label="'审核状态'" min-width="100" >
  77. <template slot-scope="scope">
  78. {{scope.row.status == null?"-":approvalStatusStr[scope.row.status]}}
  79. </template>
  80. </el-table-column>
  81. <el-table-column :label="$t('operation')" :width="300" align="left" fixed="right">
  82. <template slot-scope="scope">
  83. <el-button size="mini" type="primary" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck)&&scope.row.status!=1" @click="handleAdd(scope.$index, scope.row)">{{'编辑'}}</el-button>
  84. <!-- <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0" @click="check(scope.row,1)">{{'通过'}}</el-button>
  85. <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0" @click="check(scope.row,2)">{{'驳回'}}</el-button> -->
  86. <el-button size="mini" v-if="(permissions.projectApprovalEdit ||permissions.projectApprovalCheck) && scope.row.status==1" @click="check(scope.row,3)">{{'撤销'}}</el-button>
  87. </template>
  88. </el-table-column>
  89. </el-table>
  90. <!--工具条 footer-->
  91. <el-col :span="24" class="toolbar">
  92. <el-pagination :key="projectListPageComponentKey"
  93. @size-change="handleSizeChange"
  94. @current-change="handleCurrentChange"
  95. :page-sizes="[20 , 50 , 80 , 100]"
  96. :page-size="size"
  97. :current-page.sync="page"
  98. layout="total, sizes, prev, pager, next"
  99. :total="total"
  100. style="float:right;"
  101. ></el-pagination>
  102. </el-col>
  103. <!--新增界面-->
  104. <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="960px" :top="'6vh'">
  105. <div style="height: 72vh;overflow-y: auto;overflow-x: hidden;">
  106. <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
  107. <el-form-item :label="$t('Itemno')" :class="title == $t('newproject')" v-if="user.companyId!=936">
  108. <!-- <el-input v-model="addForm.code" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目编号" clearable></el-input> -->
  109. <el-input v-model="addForm.code" :placeholder="$t('peaseenterthe')" clearable :disabled="canOnlyModParticipator || (!permissions.projectManagement && addForm.creatorId != user.id && !permissions.projectCodeAndName)" maxlength="50" show-word-limit="true"></el-input>
  110. </el-form-item>
  111. <el-form-item :label="$t('headerTop.projectName')" prop="name">
  112. <!-- <el-input v-model="addForm.name" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目名称" clearable></el-input> -->
  113. <el-input v-model="addForm.name" :placeholder="$t('peaseenterthe')" clearable :disabled="canOnlyModParticipator || (!permissions.projectManagement && addForm.creatorId != user.id && !permissions.projectCodeAndName) || isShowProjectName" maxlength="255" show-word-limit="true"></el-input>
  114. </el-form-item>
  115. <el-form-item :label="$t('projectclassification')" v-if="user.timeType.mainProjectState != '1'">
  116. <!-- <el-select v-model="addForm.category" style="width:32%;" clearable :disabled="!permissions.projectManagement && addForm.creatorId != user.id"> -->
  117. <el-select v-model="addForm.category" style="width:32%;" clearable filterable :disabled="canOnlyModParticipator">
  118. <el-option v-for="(item) in baseClfList" :key="item.id" :value="item.id" :label="item.name"></el-option>
  119. </el-select>
  120. </el-form-item>
  121. <el-form-item :label="$t('projecttype')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" prop="isPublic">
  122. <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic" :disabled="canOnlyModParticipator">
  123. <el-option :value="0" :label="$t('zheng-shi-xiang-mu')"></el-option>
  124. <el-option :value="1" :label="$t('fei-xiang-mu')"></el-option>
  125. </el-select>
  126. </el-form-item>
  127. <el-form-item :label="$t('other.projectDescription')" prop="projectDesc">
  128. <!-- <el-input v-model="addForm.projectDesc" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目描述" clearable maxlength="4000"></el-input> -->
  129. <el-input v-model="addForm.projectDesc" :placeholder="$t('peaseenterthe')" clearable maxlength="4000" :disabled="canOnlyModParticipator" show-word-limit></el-input>
  130. </el-form-item>
  131. <el-form-item :label="$t('Allparticipants')" v-show="addForm.isPublic == 0" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
  132. <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate != 1">
  133. <div slot="content" style="width:780px">{{addForm.userNames}}</div>
  134. <el-input @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
  135. </el-tooltip>
  136. <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate == 1">
  137. <div slot="content" style="width:780px">
  138. <span v-for="(item, index) in addFormUserNames" :key="index">
  139. <!-- {{item}} -->
  140. <ww-open-data type='userName' :openid='item'></ww-open-data>
  141. <span v-if="index < addFormUserNames.length - 1">,</span>
  142. </span>
  143. </div>
  144. <div @click="showChooseMembTree" style="width: 800px;overflow:hidden;white-space:nowrap;height:40px;border: 1px solid #DCDFE6;border-radius: 4px;box-sizing: border-box;padding: 0 10px">
  145. <span v-for="(item, index) in addFormUserNames" :key="index">
  146. <!-- {{item}} -->
  147. <ww-open-data type='userName' :openid='item'></ww-open-data>
  148. <span v-if="index < addFormUserNames.length - 1">,</span>
  149. </span>
  150. </div>
  151. </el-tooltip>
  152. </el-form-item>
  153. <el-form-item :label="$t('projectmanager')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0)">
  154. <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.inchargerId" filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" :disabled="canOnlyModParticipator || projectManagerEdit">
  155. <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
  156. <span style="float: left">{{ item.name }}</span>
  157. </el-option>
  158. </el-select>
  159. <selectCat v-if="user.userNameNeedTranslate == 1" :size="'medium'" :subject="participator" :subjectId="addForm.inchargerId" :distinction="'3'" @selectCal="selectCal" :disabled="canOnlyModParticipator || projectManagerEdit || isShowProjectName"></selectCat>
  160. </el-form-item>
  161. <el-form-item :label="$t('newspaperauditor')">
  162. <el-select v-if="user.userNameNeedTranslate != '1'" @change="$forceUpdate()" v-model="addForm.auditUserIds" :disabled="!(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" filterable :placeholder="$t('defaultistheprojectleader')" style="width:100%;" :multiple="user.timeType.reportAuditType != 6" >
  163. <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
  164. </el-select>
  165. <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :tile="true" :widthStr="'800'" :disabled="!(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" :subjectId="addForm.auditUserIds" :subject="participator" :clearable="false" :distinction="'10'" :multiSelect="user.timeType.reportAuditType != 6" @selectCal="selectCal"></selectCat>
  166. </el-form-item>
  167. <!--专业项目协作版本功能 -->
  168. <el-form-item :label="$t('ji-bie')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.company.packageProject==1 && (user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
  169. <el-select v-model="addForm.level" :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" v-if="user.timeType.projectLevelState == 1" :disabled="canOnlyModParticipator || isShowProjectName">
  170. <el-option v-for="item in levelList" :key="item.id" :label="item.projectLevelName" :value="item.id"></el-option>
  171. </el-select>
  172. <el-select v-model="addForm.level" :placeholder="this.$t('defaultText.pleaseChoose')" style="width:32%;" :disabled="canOnlyModParticipator" v-else>
  173. <el-option v-for="item in importanceList" :key="item.id" :label="item.label" :value="item.id"></el-option>
  174. </el-select>
  175. </el-form-item>
  176. <!-- 增加合同金额字段 -->
  177. <el-form-item :label="$t('contractamount')" v-if="user.company.packageProject==1 && (user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
  178. <el-input id="contractAmount" v-model="addForm.contractAmount" :disabled="canOnlyModParticipator" style="width:32%;" @input="contractAmountChange(addForm.contractAmount)" :placeholder="$t('zheng-shu')" clearable @keyup.native="restrictNumber('contractAmount')"></el-input><span style="margin-left:10px;position:absolute;">{{ $t('yuan') }}</span>
  179. <template v-if="title == $t('modifytheproject') && contractAmountReasonShow">
  180. <span style="margin-left:63px;margin-right:10px;">{{ $t('modifythereason') }}</span>
  181. <el-input v-model="addForm.changeContractReason" style="width:33%" clearable :placeholder="$t('contractamountasd')"></el-input>
  182. </template>
  183. </el-form-item>
  184. <el-form-item :label="$t('ommencementDate')" prop="planStartDate" v-if="(user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
  185. <el-date-picker v-model="addForm.planStartDate" :disabled="canOnlyModParticipator"
  186. :editable="false" style="width:32%;"
  187. format="yyyy-MM-dd"
  188. value-format="yyyy-MM-dd"
  189. :clearable="false" type="date"
  190. :placeholder="$t('optiondate')"></el-date-picker>
  191. <span style="margin-left:63px;margin-right:10px;" >{{ $t('ji-hua-jie-shu-ri-qi') }}</span>
  192. <el-date-picker v-model="addForm.planEndDate" style="width:33%;"
  193. :editable="false" :disabled="canOnlyModParticipator"
  194. format="yyyy-MM-dd"
  195. value-format="yyyy-MM-dd"
  196. :clearable="false" type="date"
  197. :placeholder="$t('optiondate')"></el-date-picker>
  198. </el-form-item>
  199. <!-- 项目基线 -->
  200. <div style="margin: 10px 0 30px 0;min-height:200px;" v-if="user.company.packageProject == 1 && !canOnlyModParticipator && (user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
  201. <el-tabs v-model="activeName" @tab-click="handleClick">
  202. <el-tab-pane :label="$t('costbaseline')" name="baseCostPanel" >
  203. <div style="padding-top:10px;">
  204. <!--新版 -->
  205. <span class="rg_span" v-for="(item, index) in projectBaseCostData" :key="item.id">
  206. <span style="width:120px;display: inline-block;" v-if="user.company.packageProject==1">{{item.baseName}}</span>
  207. <el-input :id="'baseCost'+index" @input="addUpfun()" v-model="item.baseAmount" style="width:200px; margin-bottom: 20px"
  208. :placeholder="$t('zheng-shu')" clearable @keyup.native="restrictNumber('baseCost'+index)"></el-input><span style="margin-left:10px;">{{ $t('yuan') }}</span>
  209. </span>
  210. <!-- 合计 -->
  211. <div style="margin-top: 10px;float:right;">
  212. <span style="margin-right:50px;margin-right:10px;" v-if="user.company.packageProject==1">{{ $t('other.totals') }}</span>
  213. <span v-if="addForm.budget <= 0 || addForm.budget == undefined">0</span>
  214. <span v-else>{{addForm.budget | numberToCurrency}}</span>
  215. <span style="margin-right:50px;margin-left:10px;">{{ $t('yuan') }}</span>
  216. </div>
  217. </div>
  218. </el-tab-pane>
  219. </el-tabs>
  220. </div>
  221. <el-divider></el-divider>
  222. <!-- <template>
  223. <div><span>{{'审核人'}}</span></div>
  224. <div>
  225. <div v-for="(item, index) in pointList" :key="index" >
  226. 第{{index+1}}审核人:
  227. <el-select v-if="user.userNameNeedTranslate != 1" :disabled="item.status!=0" v-model="item.userId" style="width:140px;" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="manageSelect" size="small" filterable popper-class="managePopperClass">
  228. <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
  229. <span style="float: left">{{ item.name }}</span>
  230. </el-option>
  231. </el-select>
  232. <selectCat v-if="user.userNameNeedTranslate == 1" :size="'medium'" :subject="participator" :subjectId="item.userId" :distinction="'12'" @selectCal="selectCal" :disabled="canOnlyModParticipator || projectManagerEdit || isShowProjectName"></selectCat>
  233. <i class="el-icon-circle-plus-outline" @click="addInput(index)" v-if="index==pointList.length-1"></i>
  234. <i class="el-icon-remove-outline" v-if="pointList.length>1 && item.status==0" @click="deleteInput(index)"></i>
  235. <span>{{item.status==0?'待审核':item.status==1?"已审核":"已驳回"}}</span>
  236. </div>
  237. </div>
  238. </template> -->
  239. </el-form>
  240. </div>
  241. <div slot="footer" class="dialog-footer;">
  242. <el-button @click.native="deletePro(1, addForm)" v-if="(permissions.projectApprovalEdit) && addForm.id" style="float:left">{{ $t('btn.delete') }}</el-button>
  243. <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
  244. <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
  245. </div>
  246. </el-dialog>
  247. <!-- 按部门选择人员 -->
  248. <el-dialog :title="$t('selectingParticipants')" :visible.sync="chooseParticipVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
  249. <!-- <el-input style="width:100%" v-model="filterName" placeholder="请输入姓名搜索" @change="findUserInTree"></el-input> -->
  250. <div v-if="user.userNameNeedTranslate == '1'">
  251. <el-input placeholder="请输入内容" v-model.trim="filterText" class="input-with-select">
  252. <el-button slot="append" icon="el-icon-search" @click="echartDepartment()"></el-button>
  253. </el-input>
  254. </div>
  255. <div class="tree" style="height:400px">
  256. <el-scrollbar style="height:100%">
  257. <el-input
  258. :placeholder="$t('keywordfiltering')"
  259. v-model="filterText" v-if="user.userNameNeedTranslate != '1'">
  260. </el-input>
  261. <el-tree :data="deptMembData" :key="searchPersonnelFlgnum" show-checkbox :default-expand-all="searchPersonnelFlg" :props="defaultProps" node-key="id"
  262. ref="chooseMembTree" @check-change="onTreeItemChange" :default-checked-keys="addForm.userId"
  263. highlight-current :filter-node-method="filterNode">
  264. <span class="custom-tree-node" slot-scope="{ node, data }">
  265. <span v-if="user.userNameNeedTranslate == '1'">
  266. <span v-if="node.data.children">
  267. <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
  268. </span>
  269. <span v-else>
  270. <ww-open-data type='userName' :openid='node.label'></ww-open-data>
  271. </span>
  272. </span>
  273. <span v-if="user.userNameNeedTranslate != '1'">
  274. {{ node.label }}
  275. </span>
  276. <!-- {{ node.label }} -->
  277. </span>
  278. </el-tree>
  279. </el-scrollbar>
  280. </div>
  281. <div>{{ $t('btn.choose') }}&nbsp;{{chosenMembCount}}&nbsp;{{ $t('other.people') }}</div>
  282. <div slot="footer" class="dialog-footer">
  283. <el-button @click="chooseParticipVisible = false" >{{ $t('btn.cancel') }}</el-button>
  284. <el-button type="primary" @click="chooseParticip()" >{{ $t('btn.determine') }}</el-button>
  285. </div>
  286. </el-dialog>
  287. <!--用户详细信息弹出框-->
  288. <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
  289. <div class="line"><span>{{ $t('lable.name') +":"}}</span>
  290. <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
  291. <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
  292. </div>
  293. <div class="line"><span>{{ $t('Worknumber') +":"}}</span><span>{{userDetail.jobNumber}}</span></div>
  294. <div class="line"><span>{{ $t('lable.phone') +":"}}</span><span>{{userDetail.phone}}</span></div>
  295. <div class="line"><span>{{ $t('jiao-se') +":"}}</span><span>{{userDetail.roleName}}</span></div>
  296. <div class="line"><span>{{ $t('lable.department') +":"}}</span>
  297. <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
  298. <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
  299. </div>
  300. <div slot="footer" class="dialog-footer">
  301. <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
  302. </div>
  303. </el-dialog>
  304. <!--查看立项-->
  305. <el-dialog :title="$t('Checkthedetails')" v-if="projectApprovalDetailVisible" :visible.sync="projectApprovalDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
  306. <div class="line"><span>{{'项目编号:'}}</span><span>{{projectApprocalDetail.projectCode}}</span></div>
  307. <div class="line"><span>{{'项目名称:'}}</span><span>{{projectApprocalDetail.projectName}}</span></div>
  308. <div class="line"><span>{{'项目分类:'}}</span><span>{{projectApprocalDetail.categoryName}}</span></div>
  309. <div class="line"><span>{{'项目类型:'}}</span><span>{{projectApprocalDetail.isPublic==0?"正式项目":"非项目"}}</span></div>
  310. <div class="line"><span>{{'项目描述:'}}</span><span>{{projectApprocalDetail.projectDesc}}</span></div>
  311. <div class="line"><span>{{'全部参与人:'}}</span>
  312. <span v-for="(par, index) in projectApprocalDetail.participationApprovalList" :key="par.userId">
  313. <span v-if="user.userNameNeedTranslate != 1">
  314. {{par.userName}}
  315. </span>
  316. <span v-if="user.userNameNeedTranslate == 1">
  317. <ww-open-data type='userName' :openid='par.userName'></ww-open-data>
  318. </span>
  319. <span v-if="index < projectApprocalDetail.participationApprovalList.length-1">,</span>
  320. </span>
  321. </div>
  322. <div class="line"><span>{{'项目经理:'}}</span>
  323. <span v-if="user.userNameNeedTranslate != 1">{{projectApprocalDetail.inchargerName}}</span>
  324. <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='projectApprocalDetail.inchargerName'></ww-open-data></span>
  325. </div>
  326. <div class="line"><span>{{'日报审核人:'}}</span>
  327. <span v-for="(par,index) in projectApprocalDetail.projectApprovalAuditorList" :key="par.auditorId">
  328. <span v-if="user.userNameNeedTranslate != 1">
  329. {{par.auditorName}}
  330. </span>
  331. <span v-if="user.userNameNeedTranslate == 1">
  332. <ww-open-data type='userName' :openid='par.auditorName'></ww-open-data>
  333. </span>
  334. <span v-if="index < projectApprocalDetail.projectApprovalAuditorList.length-1">,</span>
  335. </span>
  336. </div>
  337. <div class="line"><span>{{'级别:'}}</span><span>{{importanceListLable[projectApprocalDetail.level-1]}}</span></div>
  338. <div class="line"><span>{{'合同金额:'}}</span><span>{{projectApprocalDetail.contractAmount}}</span></div>
  339. <div class="line">
  340. <span>{{'计划开始日期:'}}</span><span>{{projectApprocalDetail.planStartDate}}</span>
  341. <span>{{'计划结束日期:'}}</span><span>{{projectApprocalDetail.planEndDate}}</span>
  342. </div>
  343. <el-divider></el-divider>
  344. <div class="line">
  345. <span>成本基线</span>
  346. </div>
  347. <div class="line" v-for="(item,index) in projectApprocalDetail.projectApprovalBasecostList">
  348. <span>{{item.baseName+":"}}</span><span>{{item.baseAmount}}</span>
  349. </div>
  350. <el-divider></el-divider>
  351. <div class="line">
  352. <span>操作记录</span>
  353. </div>
  354. <div class="line" v-for="(item,index) in approvalLogData">
  355. <span v-if="user.userNameNeedTranslate != 1">{{item.userName}} {{item.createTime}} {{approvalTypeStr[item.type]}}了日报</span>
  356. <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.userName'></ww-open-data> {{item.createTime}}{{approvalTypeStr[item.type]}}了日报</span>
  357. </div>
  358. <div slot="footer" class="dialog-footer">
  359. <el-button type="primary" @click="projectApprovalDetailVisible = false" >{{'关闭'}}</el-button>
  360. </div>
  361. </el-dialog>
  362. <el-dialog :title="$t('other.Batchimportofworkinghours')" v-if="importDialog" :visible.sync="importDialog" customClass="customWidth" width="500px">
  363. <p>1. {{$t('other.download')}}
  364. <el-link type="primary" style="margin-left:5px;" :underline="false" :href="'./upload/立项导入模板.xlsx'" :download="'立项导入模板.xlsx'">{{'立项导入模板.xlsx'}}</el-link>
  365. </p>
  366. <p>2. {{$t('other.projectsAndPeopleInThetemplate')}}。</p>
  367. <p style="display: flex;justify-content: center;">
  368. <el-upload ref="upload" action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
  369. <el-button type="primary" :underline="false" :loading="importingData">{{$t("other.startImporting")}}</el-button>
  370. </el-upload>
  371. </p>
  372. </el-dialog>
  373. </div>
  374. </div>
  375. </section>
  376. </template>
  377. <script>
  378. import selectCat from "@/components/select.vue"
  379. export default {
  380. name: '',
  381. components: {
  382. selectCat
  383. },
  384. props: { },
  385. data() {
  386. return {
  387. keyword:"",
  388. searchField:"1",
  389. user: JSON.parse(sessionStorage.getItem("user")),
  390. total: 0,
  391. page: 1,
  392. size: localStorage.getItem("projectPageSize")==null?20:parseInt(localStorage.getItem("projectPageSize")),
  393. listLoading:false,
  394. approvalStatusStr:["待审核","已通过","已驳回","已撤销"],
  395. importanceList:[{id:1,label:this.$t('zheng-chang')},{id:2,label:this.$t('jin-ji')},{id:3,label:this.$t('zhong-yao')},{id:4,label:this.$t('zhong-yao-qie-jin-ji')}],
  396. importanceListLable:[this.$t('zheng-chang'), this.$t('jin-ji'), this.$t('zhong-yao'), this.$t('zhong-yao-qie-jin-ji'), this.$t('di-feng-xian'), this.$t('zhong-feng-xian'), this.$t('gao-feng-xian')],
  397. addFormVisible:false,
  398. baseCostItemList:[],
  399. permissions: JSON.parse(sessionStorage.getItem("permissions")),
  400. addForm: {
  401. name: '',
  402. userId: [],
  403. level:1,
  404. bu:'',
  405. id: '',
  406. code: '',
  407. projectDesc: '',
  408. alarmType: 0
  409. },
  410. projectBaseCostData:[],
  411. activeName:"baseCostPanel",
  412. baseClfList:[],
  413. addFormUserNames: [],
  414. deptMembData: [
  415. {
  416. id: 0,
  417. label: this.$t('lable.unassigned'),
  418. }
  419. ],
  420. allMembData:[],
  421. participator:[],
  422. chosenListBackup: [],
  423. chooseParticipVisible:false,
  424. rules: {
  425. name: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
  426. code: [{ required: true, message: this.$t('qing-shu-ru-bian-hao'), trigger: "blur" }],
  427. projectStageName: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
  428. projectLevelName: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
  429. deptId: [{ required: true, message: '请选择所属部门', trigger: "blur" }]
  430. },
  431. chosenMembCount:0,
  432. dataDetail:{},
  433. userDetailVisible:false,
  434. userDetail:{},
  435. pointList:[{
  436. userId:"",
  437. seq:1,
  438. status:0
  439. }],
  440. idx: 1,
  441. tableHeight: 0,
  442. projectApprovalDetailVisible:false,
  443. projectApprocalDetail:{},
  444. importDialog:false,
  445. approvalLogData:[],
  446. approvalTypeStr:["提交","编辑","通过","驳回","撤销"],
  447. }
  448. },
  449. computed: {},
  450. watch: {},
  451. created () {
  452. let height = window.innerHeight;
  453. this.tableHeight = height - 195;
  454. const that = this;
  455. window.onresize = function temp() {
  456. that.tableHeight = window.innerHeight - 195;
  457. };
  458. },
  459. mounted () {
  460. this.getList();
  461. this.getProjectBaseConfigList();
  462. this.getClfConfigList();
  463. this.getDepartment();
  464. this.getUsers();
  465. },
  466. methods: {
  467. isSelectable(row,index){
  468. if(row.creatorId == this.user.id || row.inchargerId == this.user.id || this.permissions.projectApprovalEdit){
  469. return true
  470. }else{
  471. return false
  472. }
  473. },
  474. submitInsert() {
  475. this.$refs.form1.validate(valid => {
  476. if (valid) {
  477. this.addLoading = true;
  478. let targetData = {};
  479. targetData.projectName= this.addForm.name
  480. if(this.addForm.projectDesc != null) {
  481. targetData.projectDesc=this.addForm.projectDesc
  482. }
  483. if(this.addForm.id != null) {
  484. targetData.id=this.addForm.id
  485. }
  486. if(this.addForm.isPublic != null) {
  487. targetData.isPublic=this.addForm.isPublic
  488. }
  489. if(this.addForm.userId.length != 0 && this.addForm.isPublic == 0) {
  490. let userArray=[]
  491. for(let i in this.addForm.userId){
  492. userArray.push({
  493. "userId":this.addForm.userId[i]
  494. })
  495. }
  496. targetData.participationApprovalList=userArray
  497. }
  498. if(this.addForm.inchargerId != null) {
  499. targetData.inchargerId=this.addForm.inchargerId
  500. }
  501. if(this.addForm.code != null) {
  502. targetData.projectCode=this.addForm.code
  503. }
  504. if(this.addForm.planStartDate != null) {
  505. targetData.planStartDate=this.addForm.planStartDate
  506. }
  507. if(this.addForm.planEndDate != null) {
  508. targetData.planEndDate=this.addForm.planEndDate
  509. }
  510. if(this.addForm.level != null) {
  511. targetData.level=this.addForm.level
  512. }
  513. if(this.addForm.contractAmount != null) {
  514. targetData.contractAmount=this.addForm.contractAmount
  515. }
  516. if (this.projectBaseCostData != null) {
  517. targetData.projectApprovalBasecostList=this.projectBaseCostData
  518. //计算总预算成本
  519. if (this.addForm.budget == null) {
  520. this.addForm.budget = 0;
  521. }
  522. targetData.budget=this.addForm.budget
  523. }
  524. if (this.addForm.contractAmount) {
  525. targetData.contractAmount=this.addForm.contractAmount
  526. } else {
  527. targetData.contractAmount=0
  528. }
  529. if (this.user.timeType.outputValueStatus == 1){
  530. targetData.outputValue=this.addForm.outputValue ? this.addForm.outputValue : 0
  531. }
  532. //日报审核人
  533. if (this.addForm.auditUserIds) {
  534. targetData.auditUserIds=this.addForm.auditUserIds
  535. }
  536. if(this.addForm.auditUserIds&&this.addForm.auditUserIds.length != 0) {
  537. let userArray=[]
  538. for(let i in this.addForm.auditUserIds){
  539. userArray.push({
  540. "auditorId":this.addForm.auditUserIds[i]
  541. })
  542. }
  543. targetData.projectApprovalAuditorList=userArray
  544. }
  545. if(this.addForm.category != null) {
  546. targetData.category=this.addForm.category
  547. }
  548. if(this.addForm.status != null) {
  549. targetData.status=this.addForm.status
  550. }
  551. //审核人
  552. if (this.pointList) {
  553. targetData.projectApprovalCheckList=this.pointList
  554. }
  555. this.http.JSONPost("/project-approval/editProjectApproval",targetData,
  556. res => {
  557. this.addLoading = false;
  558. if (res.code == "ok") {
  559. this.$message({
  560. message: (this.addForm.id!=null?this.$t('xiu-gai'):this.$t('create'))+this.$t('other.successful'),
  561. type: "success"
  562. });
  563. this.addFormVisible = false;
  564. this.getList();
  565. if (this.user.company.packageEngineering == 1) {
  566. this.saveProjectProfessions(res.data);
  567. }
  568. } else {
  569. this.$message({
  570. message: res.msg,
  571. type: "error"
  572. });
  573. }
  574. },
  575. error => {
  576. this.addLoading = false;
  577. this.$message({
  578. message: error,
  579. type: "error"
  580. });
  581. });
  582. }
  583. });
  584. },
  585. // 获取分类条目
  586. getClfConfigList() {
  587. this.http.get('/project-category/list',
  588. res => {
  589. if (res.code == "ok") {
  590. this.baseClfList = res.data;
  591. // console.log("获取分类条目",res.data);
  592. this.$forceUpdate();
  593. } else {
  594. this.$message({
  595. message: res.msg,
  596. type: "error"
  597. });
  598. }
  599. },
  600. error => {
  601. this.$message({
  602. message: error,
  603. type: "error"
  604. });
  605. }
  606. );
  607. },
  608. //分页
  609. handleCurrentChange(val) {
  610. this.page = val;
  611. this.getList();
  612. },
  613. handleSizeChange(val) {
  614. this.size = val;
  615. localStorage.projectPageSize = this.size;
  616. this.page = 1
  617. this.getList();
  618. },
  619. getProjectBaseConfigList() {
  620. this.http.post('/project-basecost-setting/list',{},
  621. res => {
  622. if (res.code == "ok") {
  623. this.baseCostItemList = res.data;
  624. this.$forceUpdate();
  625. } else {
  626. this.$message({
  627. message: res.msg,
  628. type: "error"
  629. });
  630. }
  631. },
  632. error => {
  633. this.$message({
  634. message: error,
  635. type: "error"
  636. });
  637. }
  638. );
  639. },
  640. //显示新增界面
  641. handleAdd(i, item) {
  642. if(i == -1) {
  643. this.title = this.$t('newproject');
  644. this.addForm = {
  645. name: '',
  646. isPublic:0,
  647. userId: [],
  648. userNames:'',
  649. code:'',
  650. inchargerId:null,
  651. level: this.user.timeType.projectLevelState == 1 ? (this.levelList.length > 0 ? this.levelList[0].id : null) : 1,
  652. customerId:null,
  653. notifyUserNames:'',
  654. chosenLeaders:[],
  655. category:null,
  656. creatorId: this.user.id,
  657. projectMainId: '',
  658. outputValue: '',
  659. bu: [],
  660. manDay:0,
  661. fromOutside: 0,
  662. status:0
  663. }
  664. this.projectBaseCostData = [];
  665. this.auseList = [];
  666. for (var m=0;m<this.baseCostItemList.length; m++) {
  667. this.projectBaseCostData.push({baseId: this.baseCostItemList[m].id, baseName:this.baseCostItemList[m].name, baseAmount:0});
  668. }
  669. this.pointList=[{
  670. "userId":"",
  671. "status":0
  672. }]
  673. } else {
  674. this.http.post('/project-approval/getDetail', {id: item.id},
  675. res => {
  676. let theData=[];
  677. if (res.code == "ok") {
  678. theData=res.data
  679. }
  680. var list = theData.participationApprovalList;
  681. if (item.isPublic == 1) {
  682. list = this.users;
  683. }
  684. var arr=[]
  685. var names=""
  686. let namesLiss = [] // 企业微信用到的参与者
  687. if (names.length > 0) {
  688. names = names.substring(0, names.length -1);
  689. }
  690. var auditorArr=[]
  691. if(theData.participationApprovalList){
  692. for(let i in theData.participationApprovalList){
  693. arr.push(theData.participationApprovalList[i].userId);
  694. names+=theData.participationApprovalList[i].userName+",";
  695. namesLiss.push(theData.participationApprovalList[i].userName)
  696. }
  697. }
  698. this.addFormUserNames = namesLiss
  699. if(theData.projectApprovalAuditorList){
  700. for(let i in theData.projectApprovalAuditorList){
  701. auditorArr.push(theData.projectApprovalAuditorList[i].auditorId)
  702. }
  703. }
  704. if (names.length > 0) {
  705. names = names.substring(0, names.length -1);
  706. }
  707. this.addForm = {
  708. id: item.id,
  709. name: item.projectName,
  710. userId: arr,
  711. auditUserIds:auditorArr,
  712. userNames:names,
  713. isPublic: item.isPublic,
  714. code:item.projectCode,
  715. inchargerId: item.inchargerId,
  716. level: item.level,
  717. planStartDate: item.planStartDate,
  718. planEndDate: item.planEndDate,
  719. budget: item.budget,
  720. baseMan: item.baseMan,
  721. contractAmount: item.contractAmount,
  722. baseFee: item.baseFee,
  723. baseRisk1: item.baseRisk1,
  724. baseRisk2: item.baseRisk2,
  725. baseOutsourcing: item.baseOutsourcing,
  726. customerId:item.customerId==0?null:item.customerId,
  727. category:item.category,
  728. projectDesc: item.projectDesc,
  729. creatorId: item.creatorId,
  730. outputValue: item.outputValue,
  731. status: item.status,
  732. }
  733. this.participator=theData.participationApprovalList
  734. this.changeParticipator();
  735. this.getProjectBaseData(item.id);
  736. console.log("===========",this.projectBaseCostData)
  737. this.getProjectCheckerData(item.id);
  738. });
  739. }
  740. this.addFormVisible = true;
  741. },
  742. //获取项目列表
  743. getList() {
  744. localStorage.projectPageIndex = this.page;
  745. this.listLoading = true;
  746. let parameter = {
  747. pageIndex: this.page,
  748. pageSize: this.size,
  749. keyword:this.keyword,
  750. searchField: this.searchField,
  751. category:this.statusClf,
  752. status: this.status,
  753. viewId:this.idx
  754. }
  755. this.http.post("/project-approval/listByPage", parameter,
  756. res => {
  757. this.listLoading = false;
  758. if (res.code == "ok") {
  759. var list = res.data.records;
  760. this.list = list;
  761. this.total = res.data.total;
  762. } else {
  763. this.$message({
  764. message: res.msg,
  765. type: "error"
  766. });
  767. }
  768. },
  769. error => {
  770. this.listLoading = false;
  771. this.$message({
  772. message: error,
  773. type: "error"
  774. });
  775. });
  776. },
  777. // 项目基线合计
  778. addUpfun() {
  779. var total = 0;
  780. for (var i=0;i<this.projectBaseCostData.length; i++) {
  781. if (this.projectBaseCostData[i].baseAmount) {
  782. total += parseFloat(this.projectBaseCostData[i].baseAmount);
  783. }
  784. }
  785. this.addForm.budget = total;
  786. },
  787. restrictNumber(targetId) {
  788. let inpu = document.getElementById(targetId);
  789. inpu.value = inpu.value.replace(/[^\d.]/g, ""); //仅保留数字和"."
  790. inpu.value = inpu.value.replace(/\.{2,}/g, "."); //两个连续的"."仅保留第一个"."
  791. inpu.value = inpu.value.replace(".", "$#*").replace(/\./g,'').replace('$#*','.');//去除其他"."
  792. inpu.value = inpu.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2');;//限制只能输入两个小数
  793. if (inpu.value.indexOf(".") < 0 && inpu.value != "") { //首位是0的话去掉
  794. inpu.value = parseFloat(inpu.value);
  795. }
  796. },
  797. showChooseLeaderTree() {
  798. this.chosenMembCount = this.chosenLeaders.length;
  799. this.chooseLeaderVisible = true;
  800. },
  801. onLeaderTreeItemChange() {
  802. var chosenList = this.$refs.chooseLeaderTree.getCheckedNodes();
  803. var list = chosenList.filter(item=>item.isUser == 1);
  804. this.chosenMembCount = list.length;
  805. },
  806. showChooseMembTree() {
  807. this.deptMembData = JSON.parse(JSON.stringify(this.allMembData))
  808. this.chosenMembCount = this.participator.length;
  809. this.chooseParticipVisible = true;
  810. this.filterText = ''
  811. this.wxFilterText = ''
  812. if(this.user.userNameNeedTranslate == 1) {
  813. this.getDepartment()
  814. }
  815. let that = this
  816. setTimeout(()=>{
  817. that.chosenListBackup = that.$refs.chooseMembTree.getCheckedNodes();
  818. }, 500)
  819. },
  820. onTreeItemChange() {
  821. var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
  822. var list = chosenList.filter(item=>item.isUser == 1);
  823. this.chosenMembCount = list.length;
  824. },
  825. findUserInTree() {
  826. if (this.filterName == '') {
  827. this.deptMembData = this.allMembData;
  828. } else {
  829. var list = this.findRecursively(this.filterName, this.allMembData);
  830. this.deptMembData = list;
  831. }
  832. },
  833. findRecursively(username, list) {
  834. var filterList = [];
  835. for (var i=0;i<list.length; i++) {
  836. if (list[i].isUser == 1) {
  837. if (list[i].label.indexOf(username) >= 0) {
  838. //匹配上了
  839. filterList.push(list[i]);
  840. }
  841. } else if (list[i].children != null && list[i].children.length > 0) {
  842. var subList = this.findRecursively(username, list[i].children);
  843. if (subList.length > 0) {
  844. subList.forEach(s=>filterList.push(s));
  845. }
  846. }
  847. }
  848. return filterList;
  849. },
  850. //确定选择参与人
  851. chooseParticip() {
  852. this.chooseParticipVisible = false;
  853. var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
  854. if(this.searchPersonnelFlg) {
  855. chosenList = [...chosenList, ...this.chosenListBackup]
  856. }
  857. this.chosenMembList = chosenList.filter(item=>item.isUser == 1);
  858. this.addForm.userNames = '';
  859. this.addFormUserNames = []
  860. this.addForm.userId = [];
  861. this.participator = [];
  862. for (var i=0;i<this.chosenMembList.length; i++) {
  863. this.addForm.userId.push(this.chosenMembList[i].id);
  864. this.addForm.userNames += this.chosenMembList[i].label+',';
  865. this.addFormUserNames.push(this.chosenMembList[i].label)
  866. var item = {id:this.chosenMembList[i].id, name:this.chosenMembList[i].label};
  867. this.participator.push(item);
  868. }
  869. if (this.addForm.userNames.length > 0) {
  870. this.addForm.userNames = this.addForm.userNames.substring(0, this.addForm.userNames.length-1);
  871. }
  872. },
  873. // 获取部门列表
  874. getDepartment() {
  875. this.http.post("/department/listAllMemb", {},
  876. res => {
  877. if (res.code == "ok") {
  878. var list = res.data;
  879. //设置员工到部门下面
  880. this.setUserToDept(list);
  881. this.deptMembData = list;
  882. console.log(this.deptMembData, '看看数据')
  883. //用于筛选过滤
  884. this.allMembData = JSON.parse(JSON.stringify(this.deptMembData));
  885. } else {
  886. this.$message({
  887. message: res.msg,
  888. type: "error"
  889. });
  890. }
  891. },
  892. error => {
  893. this.$message({
  894. message: error,
  895. type: "error"
  896. });
  897. });
  898. },
  899. onTreeItemChange() {
  900. var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
  901. var list = chosenList.filter(item=>item.isUser == 1);
  902. this.chosenMembCount = list.length;
  903. },
  904. findUserInTree() {
  905. if (this.filterName == '') {
  906. this.deptMembData = this.allMembData;
  907. } else {
  908. var list = this.findRecursively(this.filterName, this.allMembData);
  909. this.deptMembData = list;
  910. }
  911. },
  912. addPersonCheck(){
  913. var chosenList = this.$refs.chooseMembTree2.getCheckedNodes();
  914. var list = chosenList.filter(item=>item.isUser == 1);
  915. this.chosenMembCount = list.length;
  916. // console.log(list);
  917. },
  918. addPersonSure(){
  919. this.addGroupPersonPdialog = false
  920. let chosenList = this.$refs.chooseMembTree2.getCheckedNodes();
  921. let list = chosenList.filter(item=>item.isUser == 1);
  922. let listIDs = []
  923. let listNames = ''
  924. let listNamesList = []
  925. for(let i=0;i<list.length;i++){
  926. listIDs.push(list[i].id)
  927. listNames += list[i].label + ','
  928. listNamesList.push(list[i].label)
  929. }
  930. this.addGroupPersonData.person = listIDs
  931. this.addGroupPersonData.personNames = listNames
  932. this.addGroupPersonDataPersonNames = listNamesList
  933. console.log('触发', this.addGroupPersonDataPersonNames)
  934. },
  935. // 企业微信搜索
  936. echartDepartment() {
  937. console.log('我点击了搜索')
  938. if(this.filterText != '') {
  939. this.http.post("/user/getEmployeeList", {
  940. keyword: this.filterText,
  941. cursor: '',
  942. departmentId: -1,
  943. pageIndex: 1,
  944. pageSize: 1000
  945. },
  946. res => {
  947. if (res.code == "ok") {
  948. this.filterNodePersonnel = res.data.records.map(item => item.name)
  949. this.$refs.chooseMembTree.filter(this.filterText);
  950. } else {
  951. this.$message({
  952. message: res.msg,
  953. type: "error"
  954. });
  955. }
  956. },
  957. error => {
  958. this.$message({
  959. message: error,
  960. type: "error"
  961. });
  962. });
  963. } else {
  964. this.searchPersonnelFlgnum = +this.searchPersonnelFlgnum +1
  965. this.searchPersonnelFlg = false
  966. this.getDepartment()
  967. }
  968. },
  969. setUserToDept(list) {
  970. for (var i in list) {
  971. if (list[i].children != null) {
  972. this.setUserToDept(list[i].children);
  973. }
  974. if (list[i].userList != null) {
  975. if (list[i].children == null) {
  976. list[i].children = [];
  977. }
  978. list[i].userList.forEach(element => {
  979. var obj = {id: element.id, label:element.name, parentId:element.departmentId, isUser:1};
  980. list[i].children.push(obj);
  981. });
  982. }
  983. }
  984. },
  985. formDataToObject(formData) {
  986. const object = {};
  987. for (const [key, value] of formData.entries()) {
  988. if (key in object) {
  989. object[key] = [].concat(object[key], value);
  990. } else {
  991. object[key] = value;
  992. }
  993. }
  994. return object;
  995. },
  996. searchList() {
  997. this.page = 1;
  998. this.getList();
  999. },
  1000. // 分类筛选
  1001. searchClfList(){
  1002. this.page = 1;
  1003. this.getList();
  1004. },
  1005. getUsers() {
  1006. // this.http.post(this.port.manage.list, {
  1007. // departmentId: -1,
  1008. // pageIndex: 1,
  1009. // // pageSize: 99999
  1010. // pageSize: -1
  1011. // },
  1012. this.http.post('/user/getSimpleActiveUserList', {},
  1013. res => {
  1014. if (res.code == "ok") {
  1015. this.users = res.data;
  1016. } else {
  1017. this.$message({
  1018. message: res.msg,
  1019. type: "error"
  1020. });
  1021. }
  1022. },
  1023. error => {
  1024. this.$message({
  1025. message: error,
  1026. type: "error"
  1027. });
  1028. });
  1029. },
  1030. // 自定义组件事件
  1031. selectCal(obj) {
  1032. if(obj.distinction == '1') {
  1033. this.inchagerId = obj.id
  1034. this.manageSelect()
  1035. } else if(obj.distinction == '2') {
  1036. this.participationId = obj.id
  1037. this.participationSelect()
  1038. } else if(obj.distinction == '3') {
  1039. this.addForm.inchargerId = obj.id
  1040. // console.log(this.participator)
  1041. this.participator = JSON.parse(JSON.stringify(this.participator))
  1042. } else if(obj.distinction =='4') {
  1043. this.projectProfessionList[obj.other].inchargerId = obj.id
  1044. } else if(obj.distinction =='5') {
  1045. this.paramInchargerId = obj.id
  1046. }else if(obj.distinction =='6') {
  1047. this.hasSetGroupInchargerId = obj.id
  1048. } else if(obj.distinction == '10') {
  1049. let userList = obj.arrUserList
  1050. let arr = []
  1051. for(var i in userList) {
  1052. arr.push(userList[i].id)
  1053. }
  1054. this.participator = JSON.parse(JSON.stringify(this.participator))
  1055. this.addForm.auditUserIds = arr
  1056. } else if(obj.distinction == '11') {
  1057. let userList = obj.id
  1058. console.log(obj)
  1059. this.curProfessionRow.membList[obj.other].membId = userList
  1060. } else if(obj.distinction == '12') {
  1061. this.pointList.push({
  1062. "userId":obj.id,
  1063. "status":0
  1064. })
  1065. this.pointList=this.pointList.filter(i=>i.userId!="")
  1066. }
  1067. },
  1068. getProjectBaseData(projectId) {
  1069. this.http.post('/project-approval-basecost/get',{projectId: projectId},
  1070. res => {
  1071. if (res.code == "ok") {
  1072. if(res.data.length>0){
  1073. this.projectBaseCostData = res.data;
  1074. }else{
  1075. this.projectBaseCostData = [];
  1076. for (var m=0;m<this.baseCostItemList.length; m++) {
  1077. this.projectBaseCostData.push({baseId: this.baseCostItemList[m].id, baseName:this.baseCostItemList[m].name, baseAmount:0});
  1078. }
  1079. }
  1080. } else {
  1081. this.$message({
  1082. message: res.msg,
  1083. type: "error"
  1084. });
  1085. }
  1086. },
  1087. error => {
  1088. this.listLoading = false;
  1089. this.$message({
  1090. message: error,
  1091. type: "error"
  1092. });
  1093. }
  1094. );
  1095. },
  1096. getProjectCheckerData(projectId) {
  1097. this.http.post('//project-approval-check/get',{projectId: projectId},
  1098. res => {
  1099. if (res.code == "ok") {
  1100. if(res.data.length>0){
  1101. this.pointList = res.data;
  1102. }else{
  1103. this.pointList=[{
  1104. "userId":"",
  1105. "status":0
  1106. }]
  1107. }
  1108. } else {
  1109. this.$message({
  1110. message: res.msg,
  1111. type: "error"
  1112. });
  1113. }
  1114. },
  1115. error => {
  1116. this.listLoading = false;
  1117. this.$message({
  1118. message: error,
  1119. type: "error"
  1120. });
  1121. }
  1122. );
  1123. },
  1124. selectPublic() {
  1125. if (this.addForm.isPublic == 1) {
  1126. this.participator = this.users;
  1127. } else {
  1128. this.participator = [];
  1129. }
  1130. },
  1131. //选择参与人
  1132. changeParticipator() {
  1133. //检查是否在参与人中,如果没有需要加入到参与人中
  1134. // console.log('addform',this.addForm.userId,this.users);
  1135. this.participator = [];
  1136. this.addForm.userId.forEach(u=>{
  1137. var list = this.users.filter(au=>au.id == u);
  1138. if (list.length > 0) {
  1139. var findUser = list[0];
  1140. this.participator.push(findUser);
  1141. } else {
  1142. console.log('未找到用户: '+u);
  1143. }
  1144. })
  1145. },
  1146. //显示用户详情
  1147. showUser(userId) {
  1148. this.userDetailVisible = true;
  1149. this.http.post(this.port.manage.userDetail, {
  1150. userId: userId
  1151. },
  1152. res => {
  1153. if (res.code == "ok") {
  1154. this.userDetail = res.data;
  1155. } else {
  1156. this.$message({
  1157. message: res.msg,
  1158. type: "error"
  1159. });
  1160. }
  1161. },
  1162. error => {
  1163. this.$message({
  1164. message: error,
  1165. type: "error"
  1166. });
  1167. });
  1168. },
  1169. addInput(index){
  1170. this.pointList.push({
  1171. userId:"",
  1172. seq:index+2,
  1173. status:0
  1174. })
  1175. },
  1176. deleteInput(index){
  1177. this.pointList.splice(index,1)
  1178. // if(this.pointList.length<=0){
  1179. // this.pointList.push({
  1180. // checkerId:""
  1181. // })
  1182. // }
  1183. },
  1184. // 切换当前选项的索引
  1185. switchs(e) {
  1186. this.idx = e
  1187. this.page = 1
  1188. // console.log(this.searchField)
  1189. this.getList()
  1190. },
  1191. deletePro(i, item) {
  1192. this.$confirm('确定要删除立项[' + item.name +'吗]','删除立项', {
  1193. confirmButtonText: this.$t('btn.determine'),
  1194. cancelButtonText: this.$t('btn.cancel'),
  1195. type: "warning"
  1196. })
  1197. .then(() => {
  1198. this.listLoading = true;
  1199. this.http.post('/project-approval/delete',{
  1200. id: item.id
  1201. },
  1202. res => {
  1203. this.listLoading = false;
  1204. if (res.code == "ok") {
  1205. this.$message({
  1206. message: this.$t('message.successfullyDeleted'),
  1207. type: "success"
  1208. });
  1209. this.addFormVisible=false
  1210. this.getList();
  1211. } else {
  1212. this.$message({
  1213. message: res.msg,
  1214. type: "error"
  1215. });
  1216. }
  1217. },
  1218. error => {
  1219. this.listLoading = false;
  1220. this.$message({
  1221. message: error,
  1222. type: "error"
  1223. });
  1224. }
  1225. );
  1226. })
  1227. .catch(() => {});
  1228. },
  1229. check(item,checkType,revokeType){
  1230. this.listLoading = true;
  1231. this.http.post('/project-approval/check',{
  1232. id:item.id ,
  1233. checkType:checkType,
  1234. revokeType:revokeType
  1235. },
  1236. res => {
  1237. this.listLoading = false;
  1238. if (res.code == "ok") {
  1239. this.$message({
  1240. message: "操作成功",
  1241. type: "success"
  1242. });
  1243. this.addFormVisible=false
  1244. this.getList();
  1245. } else {
  1246. this.$message({
  1247. message: res.msg,
  1248. type: "error"
  1249. });
  1250. }
  1251. },
  1252. error => {
  1253. this.listLoading = false;
  1254. this.$message({
  1255. message: error,
  1256. type: "error"
  1257. });
  1258. }
  1259. );
  1260. },
  1261. showProjectApprovalDeatil(item){
  1262. this.projectApprovalDetailVisible=true
  1263. this.http.post('/project-approval/getDetail', {id: item.id},
  1264. res => {
  1265. if (res.code == "ok") {
  1266. this.projectApprocalDetail=res.data
  1267. }
  1268. });
  1269. this.getApprovalEditLog(item)
  1270. },
  1271. getApprovalEditLog(item){
  1272. this.http.post('/project-approval-log/listById', {id: item.id},
  1273. res => {
  1274. if (res.code == "ok") {
  1275. this.approvalLogData=res.data
  1276. }
  1277. });
  1278. },
  1279. batchImportData(item) {
  1280. //首先判断文件类型
  1281. let str = item.file.name.split(".");
  1282. let format = str[str.length - 1];
  1283. if (format != "xls" && format != "xlsx") {
  1284. this.$message({
  1285. message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
  1286. type: "error"
  1287. });
  1288. } else {
  1289. this.importingData = true;
  1290. let formData = new FormData();
  1291. formData.append("multipartFile", item.file);
  1292. formData.append("companyId", this.user.companyId)
  1293. this.http.uploadFile('/project-approval/importData', formData,
  1294. res => {
  1295. this.$refs.upload.clearFiles();
  1296. this.importingData = false;
  1297. if (res.code == "ok") {
  1298. //换成弹出框,以免有人等了半天回来啥也没看到
  1299. this.importResultMsg = "成功导入"+res.data+'立项数据'+(res.msg?res.msg:"");;
  1300. this.getList();
  1301. this.importDialog = false;
  1302. } else {
  1303. this.importResultMsg = this.$t('export.Importfailure')+":"+res.msg;
  1304. }
  1305. },
  1306. error => {
  1307. this.$refs.upload.clearFiles();
  1308. this.importingData = false;
  1309. this.$message({
  1310. message: error,
  1311. type: "error"
  1312. });
  1313. });
  1314. }
  1315. },
  1316. exportData(){
  1317. let parameter = {
  1318. keyword:this.keyword,
  1319. searchField: this.searchField,
  1320. category:this.statusClf,
  1321. status: this.status,
  1322. viewId:this.idx
  1323. }
  1324. this.http.post("/project-approval/exportData", parameter,
  1325. res => {
  1326. if (res.code == "ok") {
  1327. const a = document.createElement("a"); // 创建a标签
  1328. a.setAttribute("download", "立项导出.xlsx"); // download属性
  1329. a.setAttribute("href", res.data); // href链接
  1330. a.click(); // 自执行点击事件
  1331. a.remove();
  1332. } else {
  1333. this.$message({
  1334. message: res.msg,
  1335. type: "error"
  1336. });
  1337. }
  1338. },
  1339. error => {
  1340. this.$message({
  1341. message: error,
  1342. type: "error"
  1343. });
  1344. });
  1345. },
  1346. },
  1347. }
  1348. </script>
  1349. <style scoped>
  1350. .toolbar_formitem_n1{
  1351. margin-right: 0 !important;
  1352. }
  1353. .rg_span{
  1354. display: inline-block;
  1355. }
  1356. .classification {
  1357. width: 120px;
  1358. border-right: 1px solid #f2f2f2;
  1359. display: flex;
  1360. flex-wrap: wrap;
  1361. padding-top: 20px;
  1362. }
  1363. .classification p{
  1364. width: 120px;
  1365. text-align: center;
  1366. line-height: 50px;
  1367. margin: 0;
  1368. cursor: pointer;
  1369. }
  1370. .classification p:hover {
  1371. background: #dddddd;
  1372. }
  1373. .on {
  1374. color: #409EFF;
  1375. }
  1376. </style>