plm前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1266 lines
44 KiB

3 years ago
3 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
1 year ago
3 years ago
3 years ago
3 years ago
1 year ago
3 years ago
1 year ago
3 years ago
2 years ago
1 year ago
2 years ago
3 years ago
1 year ago
3 years ago
1 year ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
1 year ago
3 years ago
3 years ago
2 years ago
1 year ago
1 year ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
1 year ago
1 year ago
3 years ago
2 years ago
1 year ago
1 year ago
2 years ago
1 year ago
1 year ago
3 years ago
1 year ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
1 year ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
1 year ago
2 years ago
1 year ago
3 years ago
3 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
1 year ago
1 year ago
1 year ago
1 year ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
3 years ago
1 year ago
3 years ago
2 years ago
1 year ago
3 years ago
2 years ago
2 years ago
3 years ago
1 year ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
3 years ago
3 years ago
  1. <template>
  2. <div class="mod-config">
  3. <el-dialog width="40%" :title="value === 'save' ? '新增-项目' :value === 'update'?'修改-项目':'新增-子项目'" :close-on-click-modal="false" :visible.sync="visible" @close="closeSaveDialog">
  4. <el-form ref="saveForm" :model="dataForm" label-position="top" label-width="100px" :rules="projectRole">
  5. <el-row :gutter="25">
  6. <el-col :span="6">
  7. <el-form-item :label="(value !=='save' && value !== 'update')?'上级项目号':'项目号'">
  8. <el-input v-model="dataForm.projectId" disabled ></el-input>
  9. </el-form-item>
  10. </el-col>
  11. <el-col :span="12">
  12. <el-form-item label="项目名称" prop="projectName">
  13. <el-input v-model="dataForm.projectName" :disabled="isProjectFieldDisabled('projectName')" ></el-input>
  14. </el-form-item>
  15. </el-col>
  16. <el-col :span="6">
  17. <el-form-item prop="projectTypeDb" label="项目类型">
  18. <dict-data-select dict-type="project_info_type_db" v-if="visible" v-model="dataForm.projectTypeDb" :disabled="isProjectFieldDisabled('projectTypeDb')"></dict-data-select>
  19. </el-form-item>
  20. </el-col>
  21. <el-col :span="6">
  22. <el-form-item prop="industry" label="行业">
  23. <dict-data-select dict-type="project_info_industry" v-if="visible" v-model="dataForm.industry" :disabled="isProjectFieldDisabled('industry')"></dict-data-select>
  24. </el-form-item>
  25. </el-col>
  26. <el-col :span="6">
  27. <el-form-item prop="priority" label="优先级">
  28. <dict-data-select dict-type="project_info_priority" v-if="visible" v-model="dataForm.priority" :disabled="isProjectFieldDisabled('priority')"></dict-data-select>
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="6">
  32. <el-form-item prop="projectManagerName">
  33. <span v-if="isProjectTeamFieldDisabled('projectManagerList')" slot="label">项目经理</span>
  34. <span v-else slot="label" @click="managerChooseModal()"><a herf="#">项目经理</a></span>
  35. <el-input v-model="dataForm.projectManagerName" readonly ></el-input>
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="6">
  39. <el-form-item prop="projectOwnerName" :rules="projectRole.projectOwnerName">
  40. <span v-if="isProjectTeamFieldDisabled('projectOwnerList')" slot="label">项目审批人</span>
  41. <span v-else slot="label" @click="ownerChooseModal()"><a herf="#">项目审批人</a></span>
  42. <el-input v-model="dataForm.projectOwnerName" readonly></el-input>
  43. </el-form-item>
  44. </el-col>
  45. <el-col :span="6">
  46. <el-form-item prop="customerId">
  47. <span slot="label" style="" @click="!isProjectFieldDisabled('customerId') && getBaseList(102,1)"><a herf="#">客户</a></span>
  48. <el-input v-model="dataForm.customerId" @blur="getCustomerName(1)" :disabled="isProjectFieldDisabled('customerId')"></el-input>
  49. </el-form-item>
  50. </el-col>
  51. <el-col :span="12">
  52. <el-form-item prop="customerName" label="客户名称">
  53. <el-input v-model="dataForm.customerName" disabled></el-input>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="6">
  57. <!-- <el-form-item label="终端客户">-->
  58. <!--&lt;!&ndash; <span slot="label" style="" @click="getBaseList(102,2)"><a herf="#">终端客户</a></span>&ndash;&gt;-->
  59. <!--&lt;!&ndash; <el-input v-model="dataForm.finalCustomerId" @blur="getCustomerName(2)"></el-input>&ndash;&gt;-->
  60. <!-- <dict-data-select v-model="dataForm.finalCustomerId" clearable filterable dict-type="finalCustomer" :use-default-value="true"></dict-data-select>-->
  61. <!-- </el-form-item>-->
  62. </el-col>
  63. <!-- <el-col :span="12">-->
  64. <!-- <el-form-item label="终端客户名称:">-->
  65. <!-- <el-input v-model="dataForm.finalCustomerName" disabled ></el-input>-->
  66. <!-- </el-form-item>-->
  67. <!-- </el-col>-->
  68. <el-col :span="6">
  69. <el-form-item label="客户项目号">
  70. <el-input v-model="dataForm.customerProjectNo" :disabled="isProjectFieldDisabled('customerProjectNo')" ></el-input>
  71. </el-form-item>
  72. </el-col>
  73. <el-col :span="6">
  74. <el-form-item class="project-amount-form-item">
  75. <span slot="label" class="project-amount-label">项目年销售额CNY(K)</span>
  76. <el-input v-model="dataForm.projectAmount" :disabled="isProjectFieldDisabled('projectAmount')" @input="dataForm.projectAmount = dataForm.projectAmount.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace(/^(\d+\.\d{1,6}).*$/, '$1')"></el-input>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="8">
  80. <el-form-item label="直接客户">
  81. <el-input v-model="dataForm.finalCustomerId" :disabled="isProjectFieldDisabled('finalCustomerId')"></el-input>
  82. </el-form-item>
  83. </el-col>
  84. </el-row>
  85. <el-form-item label="项目描述" style="height: 70px">
  86. <el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="dataForm.projectDesc" :disabled="isProjectFieldDisabled('projectDesc')" ></el-input>
  87. </el-form-item>
  88. <el-form-item label="客户应用/要求" style="height: 70px">
  89. <el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="dataForm.customerRemark" :disabled="isProjectFieldDisabled('customerRemark')" ></el-input>
  90. </el-form-item>
  91. <el-form-item label="其他要求" style="height: 70px">
  92. <el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="dataForm.remark" :disabled="isProjectFieldDisabled('remark')" ></el-input>
  93. </el-form-item>
  94. <el-form-item prop="userRoleName" :rules="projectRole.userRoleName">
  95. <span slot="label" style="" @click="!isProjectFieldDisabled('userRoleName') && userRollModal()"><a herf="#">项目权限</a></span>
  96. <el-input v-model="dataForm.userRoleName" :disabled="isProjectFieldDisabled('userRoleName')" ></el-input>
  97. </el-form-item>
  98. </el-form>
  99. <span slot="footer" class="dialog-footer">
  100. <el-button type="primary" v-if="canSaveAction()" @click="dataFormSubmit()">{{'保存'}}</el-button>
  101. <el-button type="primary" @click="visible = false">{{'关闭'}}</el-button>
  102. <el-button type="primary" v-if="canAgreeAction()" :loading="submitLoading" @click="agreeSubmit">同意</el-button>
  103. <el-button type="primary" v-if="canRejectAction()" :loading="submitLoading" @click="openRejectModal">驳回</el-button>
  104. </span>
  105. </el-dialog>
  106. <el-dialog title="驳回" top="30vh" :close-on-click-modal="false" :visible.sync="submitModalFlag" width="500px">
  107. <el-form label-position="top">
  108. <el-form-item label="驳回意见">
  109. <el-input type="textarea" v-model="rejectOpinion" :rows="3" resize="none"></el-input>
  110. </el-form-item>
  111. </el-form>
  112. <span slot="footer" class="dialog-footer">
  113. <el-button type="primary" :loading="submitLoading" @click="rejectSubmit">确定</el-button>
  114. <el-button type="primary" @click="submitModalFlag = false">取消</el-button>
  115. </span>
  116. </el-dialog>
  117. <el-dialog
  118. width="530px"
  119. title="项目经理"
  120. :close-on-click-modal="false"
  121. :visible.sync="managerFlag">
  122. <el-transfer class="rq" filterable v-model="projectManagerList" :props="{
  123. key: 'operatorId',
  124. label: 'operatorName'
  125. }" :data="operatorList" :titles="['未选择', '已选择']"></el-transfer>
  126. <span slot="footer" class="dialog-footer">
  127. <div style="margin-top: 5px">
  128. <el-button type="primary" @click="saveManagerList()">确定</el-button>
  129. <el-button @click="managerFlag = false" type="primary">取消</el-button>
  130. </div>
  131. </span>
  132. </el-dialog>
  133. <el-dialog
  134. width="530px"
  135. title="项目审批人"
  136. :close-on-click-modal="false"
  137. :visible.sync="ownerFlag">
  138. <el-transfer class="rq" filterable v-model="projectOwnerList" :props="{
  139. key: 'operatorId',
  140. label: 'operatorName'
  141. }" :data="operatorList" :titles="['未选择', '已选择']"></el-transfer>
  142. <span slot="footer" class="dialog-footer">
  143. <el-button type="primary" @click="saveOwnerList()">确定</el-button>
  144. <el-button @click="ownerFlag = false" type="primary">取消</el-button>
  145. </span>
  146. </el-dialog>
  147. <el-dialog
  148. width="530px"
  149. title="权限"
  150. :close-on-click-modal="false"
  151. :visible.sync="userRoleFlag">
  152. <el-form :inline="true" :model="userRoleForm" label-position="top">
  153. <el-form-item label="账号">
  154. <el-input v-model="userRoleForm.username" placeholder=" "></el-input>
  155. </el-form-item>
  156. <el-form-item label="姓名">
  157. <el-input v-model="userRoleForm.userDisplay" placeholder=" "></el-input>
  158. </el-form-item>
  159. <el-form-item label=" ">
  160. <!-- <el-button type="primary" @click="searchUserRoll()">查询</el-button>-->
  161. <el-button type="primary" @click="loadView">查询</el-button>
  162. </el-form-item>
  163. </el-form>
  164. <el-table
  165. ref="table"
  166. :data="copyUserRoleList"
  167. border
  168. :height="300"
  169. v-loading="queryUserRoleListLoading"
  170. style="width: 100%;">
  171. <el-table-column
  172. prop="username"
  173. header-align="center"
  174. align="center"
  175. min-width="35"
  176. label="账号">
  177. </el-table-column>
  178. <el-table-column
  179. prop="userDisplay"
  180. header-align="center"
  181. align="center"
  182. min-width="35"
  183. label="姓名">
  184. </el-table-column>
  185. <el-table-column
  186. prop=""
  187. header-align="center"
  188. align="center"
  189. min-width="30"
  190. label="">
  191. <template slot="header" slot-scope="scope">
  192. <el-checkbox :indeterminate="saveCheckAllIndeterminate" v-model="saveCheckAll" true-label="Y" false-label="N" @change="changeSaveCheckAll"></el-checkbox>
  193. </template>
  194. <template slot-scope="scope">
  195. <!-- 如果数据为Y显示勾选框否则不勾选 -->
  196. <el-checkbox :indeterminate="userRoleIndeterminateList[scope.$index]" v-model="scope.row.checkAll" @change="changeAll(scope.row)"></el-checkbox>
  197. </template>
  198. </el-table-column>
  199. <el-table-column
  200. prop=""
  201. header-align="center"
  202. align="center"
  203. min-width="30"
  204. label="查询">
  205. <template slot-scope="scope">
  206. <!-- 如果数据为Y显示勾选框否则不勾选 -->
  207. <el-checkbox v-model="scope.row.searchCheck" @change="changeCheck(scope.row,1)"></el-checkbox>
  208. </template>
  209. </el-table-column>
  210. <el-table-column
  211. prop=""
  212. header-align="center"
  213. align="center"
  214. min-width="30"
  215. label="修改">
  216. <template slot-scope="scope">
  217. <!-- 如果数据为Y显示勾选框否则不勾选 -->
  218. <el-checkbox v-model="scope.row.updateCheck" @change="changeCheck(scope.row,2)"></el-checkbox>
  219. </template>
  220. </el-table-column>
  221. <el-table-column
  222. prop=""
  223. header-align="center"
  224. align="center"
  225. min-width="30"
  226. label="下载">
  227. <template slot-scope="scope">
  228. <!-- 如果数据为Y显示勾选框否则不勾选 -->
  229. <el-checkbox v-model="scope.row.downCheck" @change="changeCheck(scope.row,3)"></el-checkbox>
  230. </template>
  231. </el-table-column>
  232. <el-table-column
  233. prop=""
  234. header-align="center"
  235. align="center"
  236. min-width="30"
  237. label="删除">
  238. <template slot-scope="scope">
  239. <!-- 如果数据为Y显示勾选框否则不勾选 -->
  240. <el-checkbox v-model="scope.row.deleteCheck" @change="changeCheck(scope.row,4)"></el-checkbox>
  241. </template>
  242. </el-table-column>
  243. </el-table>
  244. <span slot="footer" class="dialog-footer">
  245. <div style="margin-top: 5px">
  246. <el-button type="primary" @click="saveUserList()">确定</el-button>
  247. <el-button @click="userRoleFlag = false" type="primary">取消</el-button>
  248. </div>
  249. </span>
  250. </el-dialog>
  251. <Chooselist ref="baseList" @getBaseData="getBaseData"></Chooselist>
  252. </div>
  253. </template>
  254. <script>
  255. import {
  256. projectInfoSearch,
  257. searchOperatorWithSite,
  258. searchProjectTeamStr,
  259. searchUserRoll,
  260. searchSelectionUserRole,
  261. saveProjectInfo,
  262. submitProjectInfo,
  263. } from "@/api/project/project.js"
  264. import Chooselist from '@/views/modules/common/Chooselist'
  265. import DictDataSelect from "../../sys/dict-data-select.vue";
  266. import {queryCustomer
  267. } from "@/api/customer/customerInformation";
  268. import item from "../../code/item.vue";
  269. import {queryUsernameByRoleSuperFlag} from "../../../../api/project/project";
  270. import {getNodeAuthority, checkSuperAdmin} from "@/api/changeManagement/changeManagement"
  271. import {isAuth} from "../../../../utils";
  272. export default {
  273. model:{
  274. prop:'value',
  275. event:'change',
  276. },
  277. props:{
  278. value:{
  279. required:true,
  280. type:String,
  281. }
  282. },
  283. components: {
  284. DictDataSelect,
  285. Chooselist
  286. },
  287. data () {
  288. return {
  289. tagNo:'',
  290. tagNo1:'',
  291. visible: false,
  292. treeVisible: false,
  293. managerFlag:false,
  294. userRoleFlag:false,
  295. ownerFlag:false,
  296. submitModalFlag:false,
  297. submitLoading:false,
  298. rejectOpinion:'',
  299. nodeAuthorityLoaded: true,
  300. plmProjectAuthorityArr: [],
  301. plmProjectTeamAuthorityArr: [],
  302. menuId: '101002001',
  303. authSubmit: false,
  304. authReject: false,
  305. superAdmin: false,
  306. createBy2: this.$store.state.user.name,
  307. operatorList:[],
  308. dataForm: {
  309. id: 0,
  310. site:this.$store.state.user.site,
  311. projectLevel:1,
  312. customerProjectNo:'',
  313. projectId:'',
  314. projectTypeDb:'',
  315. projectType:'',
  316. customerName:'',
  317. finalCustomerName:'',
  318. customerId:'',
  319. finalCustomerId:'',
  320. projectName:'',
  321. projectDesc:'',
  322. needDate:'',
  323. priority:'',
  324. projectSource:'',
  325. industry:'',
  326. priorityDesc:'',
  327. projectSourceDesc:'',
  328. industryDesc:'',
  329. projectManagerName:'',
  330. projectOwnerName:'',
  331. customerRemark:'',
  332. remark:'',
  333. userRoleName:'',
  334. projectManagerList:[],
  335. projectOwnerList:[],
  336. userRoleList:[],
  337. productSet:'',
  338. projectAmount:'',
  339. status:'草稿',
  340. stepId: 10,
  341. rejectFlag: 'N',
  342. createBy2: '',
  343. isReject: 'N'
  344. },
  345. userRoleForm:{
  346. username:'',
  347. userDisplay:'',
  348. },
  349. projectManagerList:[],
  350. projectOwnerList:[],
  351. userRoleList:[],
  352. projectRole: {
  353. projectLevel: [
  354. {
  355. required: true,
  356. message: ' ',
  357. trigger: ['change','blur']
  358. }
  359. ],
  360. customerName: [
  361. {
  362. required: true,
  363. message: ' ',
  364. trigger: ['change','blur']
  365. }
  366. ],
  367. projectName: [
  368. {
  369. required: true,
  370. message: ' ',
  371. trigger: ['change','blur']
  372. }
  373. ],
  374. customerId: [
  375. {
  376. required: true,
  377. message: ' ',
  378. trigger: ['change','blur']
  379. }
  380. ],
  381. projectOwnerName: [
  382. {
  383. required: true,
  384. message: ' ',
  385. trigger: 'change'
  386. }
  387. ],
  388. userRoleName: [
  389. {
  390. required: true,
  391. message: ' ',
  392. trigger: 'change'
  393. }
  394. ],
  395. },
  396. saveCheckAll:'N',
  397. queryUserRoleListLoading:false,
  398. filterParams:{
  399. },
  400. }
  401. },
  402. created () {
  403. this.menuId = (this.$route.meta && this.$route.meta.menuId) || this.menuId
  404. this.authSubmit = isAuth(this.menuId + ':submit')
  405. this.authReject = isAuth(this.menuId + ':reject')
  406. checkSuperAdmin().then(({data}) => {
  407. this.superAdmin = !!(data && data.superAdmin)
  408. })
  409. },
  410. watch:{
  411. userRoleFlag(newVal,oldVal){
  412. if (newVal === false){
  413. this.userRoleForm.username = ''
  414. this.userRoleForm.userDisplay = ''
  415. // this.saveCheckAll='N'
  416. }
  417. },
  418. queryUserRoleListLoading(newVal,oldVal){
  419. if (newVal){
  420. setTimeout(()=>{
  421. this.queryUserRoleListLoading = false
  422. },5000)
  423. }
  424. },
  425. },
  426. computed:{
  427. saveCheckAllIndeterminate(){
  428. if (this.userRoleList.every(item => item.checkAll === true)){
  429. this.saveCheckAll = 'Y'
  430. return false
  431. }else if (this.userRoleList.every(item => item.checkAll === false)){
  432. this.saveCheckAll = 'N'
  433. return false
  434. }else {
  435. this.saveCheckAll = 'N'
  436. return true
  437. }
  438. },
  439. userRoleIndeterminateList(){
  440. return this.userRoleList.map(item=>{
  441. if (item.checkAll === true){
  442. return false
  443. }else {
  444. return !(item.searchCheck === false && item.updateCheck === false && item.downCheck === false && item.deleteCheck === false);
  445. }
  446. })
  447. },
  448. copyUserRoleList: {
  449. get() {
  450. return this.userRoleList.filter(item => {
  451. const usernameMatch = this.filterParams.username
  452. ? item.username.toLowerCase().includes(this.filterParams.username.toLowerCase())
  453. : true;
  454. const userDisplayMatch = this.filterParams.userDisplay
  455. ? item.userDisplay.toLowerCase().includes(this.filterParams.userDisplay.toLowerCase())
  456. : true;
  457. return usernameMatch && userDisplayMatch;
  458. });
  459. }
  460. }
  461. },
  462. methods: {
  463. loadView(){
  464. this.filterParams = {
  465. ...this.userRoleForm
  466. }
  467. },
  468. // 获取基础数据列表S
  469. getBaseList (val, type) {
  470. this.tagNo = val
  471. this.tagNo1 = type
  472. this.$nextTick(() => {
  473. let strVal = ''
  474. let conSql = ''
  475. if (val === 1010) {
  476. if(type==1) {
  477. strVal = this.dataForm.projectTypeDb
  478. }
  479. }
  480. if (val === 106) {
  481. if(type==1) {
  482. strVal = this.dataForm.buNo
  483. }
  484. }
  485. if (val === 102) {
  486. if(type==1) {
  487. strVal = this.dataForm.customerId
  488. conSql = " order by Customer_no "
  489. }
  490. if(type==2) {
  491. strVal = this.dataForm.finalCustomerId
  492. }
  493. }
  494. if (val === 1011) {
  495. if(type==1) {
  496. strVal = this.dataForm.projectSource
  497. }
  498. }
  499. if (val === 1012) {
  500. if(type==1) {
  501. strVal = this.dataForm.priority
  502. }
  503. }
  504. this.$refs.baseList.init(val, strVal, conSql)
  505. })
  506. },
  507. /* 列表方法的回调 */
  508. getBaseData (val) {
  509. if (this.tagNo === 1010) {
  510. if(this.tagNo1==1) {
  511. this.dataForm.projectTypeDb = val.Base_id
  512. this.dataForm.projectType = val.Base_desc
  513. }
  514. }
  515. if (this.tagNo === 102) {
  516. if(this.tagNo1==1) {
  517. this.dataForm.customerId = val.Customer_no
  518. this.dataForm.customerName = val.Customer_desc
  519. }
  520. if(this.tagNo1==2) {
  521. this.dataForm.finalCustomerId = val.Customer_no
  522. this.dataForm.finalCustomerName = val.Customer_desc
  523. }
  524. }
  525. if (this.tagNo === 1011) {
  526. if(this.tagNo1==1) {
  527. this.dataForm.projectSource = val.Base_id
  528. this.dataForm.projectSourceDesc = val.Base_desc
  529. }
  530. }
  531. if (this.tagNo === 1012) {
  532. if(this.tagNo1==1) {
  533. this.dataForm.priority = val.Base_id
  534. this.dataForm.priorityDesc = val.Base_desc
  535. }
  536. }
  537. if (this.tagNo === 106) {
  538. if(this.tagNo1==1) {
  539. this.dataForm.buNo = val.Bu_no
  540. this.dataForm.buDesc = val.Bu_desc
  541. }
  542. }
  543. },
  544. init (id) {
  545. this.dataForm.id = id || 0
  546. let requestCustomer = null;
  547. if (this.dataForm.customerId){
  548. requestCustomer = JSON.parse(JSON.stringify(this.dataForm))
  549. }
  550. if(this.dataForm.id!==0){
  551. let inData={
  552. page: 1,
  553. limit: 10,
  554. id:id,
  555. menuId: this.menuId,
  556. userId: this.$store.state.user.name
  557. }
  558. projectInfoSearch(inData).then(({data}) => {
  559. if(data.page.list.length>0){
  560. this.dataForm= data.page.list[0];
  561. const isReject = String(this.dataForm.isReject || this.dataForm.reject || '').trim().toUpperCase() === 'Y' ? 'Y' : 'N'
  562. this.$set(this.dataForm, 'isReject', isReject)
  563. let inData={
  564. site:this.dataForm.site,
  565. projectId:this.dataForm.projectId,
  566. type:'manager',
  567. }
  568. searchProjectTeamStr(inData).then(({data}) => {
  569. this.dataForm.projectManagerList=data.rows
  570. })
  571. let inData2={
  572. site:this.dataForm.site,
  573. projectId:this.dataForm.projectId,
  574. type:'owner',
  575. }
  576. searchProjectTeamStr(inData2).then(({data}) => {
  577. this.dataForm.projectOwnerList=data.rows
  578. })
  579. this.searchUserRollAll();
  580. this.loadNodeAuthority(this.dataForm.site, this.dataForm.stepId || 10)
  581. }
  582. })
  583. } else { // 项目新增
  584. this.dataForm = {
  585. id: 0,
  586. site: this.$store.state.user.site,
  587. projectLevel: 1,
  588. customerProjectNo: '',
  589. projectId: '',
  590. projectTypeDb: '',
  591. projectType: '',
  592. customerName: '',
  593. finalCustomerName: '',
  594. customerId: '',
  595. finalCustomerId: '',
  596. projectName: '',
  597. projectDesc: '',
  598. needDate: '',
  599. priority: '',
  600. projectSource: '',
  601. industry: '',
  602. priorityDesc: '',
  603. projectSourceDesc: '',
  604. industryDesc: '',
  605. projectManagerName: '',
  606. projectOwnerName: '',
  607. customerRemark: '',
  608. remark: '',
  609. userRoleName: '',
  610. projectManagerList: [],
  611. projectOwnerList: [],
  612. userRoleList: [],
  613. productSet: '',
  614. projectAmount: '',
  615. status: '草稿',
  616. stepId: 10,
  617. rejectFlag: 'N',
  618. createBy2: '',
  619. isReject: 'N'
  620. }
  621. this.plmProjectAuthorityArr = []
  622. this.plmProjectTeamAuthorityArr = []
  623. this.nodeAuthorityLoaded = true
  624. // 默认插入当前用户
  625. this.addRollForUsername(this.$store.state.user.name,this.$store.state.user.userDisplay)
  626. // this.searchUserRollAll();
  627. // 添加超级管理员角色
  628. let params = {
  629. site: this.$store.state.user.site
  630. }
  631. queryUsernameByRoleSuperFlag(params).then(({data})=>{
  632. if (data && data.code === 0){
  633. let rows = []
  634. rows = data.rows;
  635. rows.forEach(item => {
  636. this.addRollForUsername(item.username,item.userDisplay)
  637. })
  638. }
  639. })
  640. }
  641. if (requestCustomer) {
  642. this.initCustomer(requestCustomer)
  643. }
  644. this.visible = true
  645. },
  646. searchUserRoll(){
  647. let inData3={
  648. site:this.dataForm.site,
  649. projectId:this.dataForm.projectId,
  650. username:this.userRoleForm.username,
  651. userDisplay:this.userRoleForm.userDisplay,
  652. checkList:this.dataForm.userRoleList,
  653. }
  654. this.queryUserRoleListLoading = true
  655. this.userRoleList = []
  656. searchUserRoll(inData3).then(({data}) => {
  657. if (data && data.code === 0){
  658. this.userRoleList = data.rows;
  659. }else {
  660. this.$message.warning(data.msg)
  661. }
  662. this.queryUserRoleListLoading = false
  663. }).catch((error)=>{
  664. this.$message.error(error)
  665. this.queryUserRoleListLoading = false
  666. })
  667. },
  668. searchUserRollAll(){
  669. let inData3={
  670. site:this.dataForm.site,
  671. projectId:this.dataForm.projectId,
  672. }
  673. // searchUserRoll(inData3).then(({data}) => {
  674. // this.dataForm.userRoleList=data.rows;
  675. // // this.userRollModal();
  676. // })
  677. searchSelectionUserRole(inData3).then(({data})=>{
  678. if (data && data.code === 0){
  679. this.dataForm.userRoleList = data.rows;
  680. }
  681. })
  682. },
  683. managerChooseModal(){
  684. let inData={
  685. site:this.dataForm.site,
  686. projectId:this.dataForm.projectId,
  687. roleNo:'R001',
  688. }
  689. this.operatorList = [];
  690. searchOperatorWithSite(inData).then(({data}) => {
  691. this.operatorList=data.rows
  692. })
  693. this.projectManagerList = JSON.parse(JSON.stringify(this.dataForm.projectManagerList));
  694. this.managerFlag=true
  695. },
  696. saveManagerList(){
  697. let projectManagerName='';
  698. let selectionManagerList = this.operatorList.filter((item) => {
  699. return this.projectManagerList.includes(item.operatorId);
  700. })
  701. projectManagerName=selectionManagerList.map(item => item.operatorName).join(';');
  702. for (let i = 0; i < selectionManagerList.length; i++) {
  703. let row = selectionManagerList[i]
  704. this.addRollForUsername(row.operatorId,row.operatorName)
  705. }
  706. this.dataForm.projectManagerName=projectManagerName
  707. this.dataForm.projectManagerList=JSON.parse(JSON.stringify(this.projectManagerList));
  708. this.managerFlag=false
  709. },
  710. ownerChooseModal(){
  711. let inData={
  712. site:this.dataForm.site,
  713. projectId:this.dataForm.projectId,
  714. roleNo:'R016',
  715. }
  716. this.operatorList = [];
  717. searchOperatorWithSite(inData).then(({data}) => {
  718. this.operatorList=data.rows
  719. })
  720. this.projectOwnerList = JSON.parse(JSON.stringify(this.dataForm.projectOwnerList));
  721. this.ownerFlag=true
  722. },
  723. saveOwnerList(){
  724. let projectOwnerName='';
  725. let selectionOwnerList = this.operatorList.filter((item) => {
  726. return this.projectOwnerList.includes(item.operatorId);
  727. })
  728. projectOwnerName=selectionOwnerList.map(item => item.operatorName).join(';');
  729. for (let i = 0; i < selectionOwnerList.length; i++) {
  730. let row = selectionOwnerList[i]
  731. this.addRollForUsername(row.operatorId,row.operatorName)
  732. }
  733. this.dataForm.projectOwnerName = projectOwnerName
  734. this.dataForm.projectOwnerList=JSON.parse(JSON.stringify(this.projectOwnerList));
  735. this.ownerFlag=false
  736. },
  737. addRollForUsername(username,userDisplay){
  738. if(this.dataForm.userRoleList.length>0) {
  739. let checkList = this.dataForm.userRoleList.filter(item => item.username === username)
  740. if (checkList.length === 0) {
  741. this.dataForm.userRoleList.push({
  742. checkAll: true,
  743. deleteCheck: true,
  744. deleteFlag: 'Y',
  745. downCheck: true,
  746. downFlag: 'Y',
  747. searchCheck: true,
  748. searchFlag: 'Y',
  749. updateCheck: true,
  750. updateFlag: 'Y',
  751. userDisplay: userDisplay,
  752. username: username,
  753. })
  754. }
  755. }else {
  756. this.dataForm.userRoleList=[{
  757. checkAll: true,
  758. deleteCheck: true,
  759. deleteFlag: 'Y',
  760. downCheck: true,
  761. downFlag: 'Y',
  762. searchCheck: true,
  763. searchFlag: 'Y',
  764. updateCheck: true,
  765. updateFlag: 'Y',
  766. userDisplay: userDisplay,
  767. username: username,
  768. }]
  769. }
  770. let selectionUserList = this.dataForm.userRoleList.filter(item => item.searchCheck || item.updateCheck || item.downCheck || item.deleteCheck)
  771. this.dataForm.userRoleName = selectionUserList.map(item => item.userDisplay).join(';');
  772. },
  773. userRollModal(){
  774. this.searchUserRoll()
  775. this.userRoleFlag=true
  776. },
  777. saveUserList(){
  778. let name = "";
  779. let selectionUserList = this.userRoleList.filter(item => item.searchCheck || item.updateCheck || item.downCheck || item.deleteCheck)
  780. this.dataForm.userRoleList = [...selectionUserList]
  781. name = selectionUserList.map(item => item.userDisplay).join(";")
  782. // for (let i = 0; i <this.userRoleList.length ; i++) {
  783. // if(this.userRoleList[i].username===this.$store.state.user.name){
  784. // this.userRoleList[i].searchCheck=true;
  785. // this.userRoleList[i].updateCheck=true;
  786. // this.userRoleList[i].downCheck=true;
  787. // this.userRoleList[i].deleteCheck=true;
  788. // this.userRoleList[i].searchFlag='Y'
  789. // this.userRoleList[i].updateFlag='Y'
  790. // this.userRoleList[i].downFlag='Y'
  791. // this.userRoleList[i].deleteFlag='Y'
  792. // }
  793. // }
  794. // let name = '';
  795. // for (let i = 0; i < this.userRoleList.length; i++) {
  796. // this.dataForm.userRoleList=this.dataForm.userRoleList.filter(item => item.username !== this.userRoleList[i].username)
  797. // if(this.userRoleList[i].searchCheck||this.userRoleList[i].updateCheck||this.userRoleList[i].downCheck||this.userRoleList[i].deleteCheck){
  798. // this.dataForm.userRoleList.push(this.userRoleList[i])
  799. // }
  800. // }
  801. // for (let i = 0; i < this.dataForm.userRoleList.length; i++) {
  802. // if(this.dataForm.userRoleList[i].searchCheck||this.dataForm.userRoleList[i].updateCheck
  803. // ||this.dataForm.userRoleList[i].downCheck||this.dataForm.userRoleList[i].deleteCheck){
  804. // name+=this.dataForm.userRoleList[i].userDisplay+';'
  805. // }
  806. // }
  807. this.dataForm.userRoleName = name
  808. // this.dataForm.userRoleList=JSON.parse(JSON.stringify(this.userRoleList));
  809. this.userRoleFlag=false
  810. },
  811. changeAll(row){
  812. if(row.checkAll){
  813. row.searchCheck=true;
  814. row.updateCheck=true;
  815. row.downCheck=true;
  816. row.deleteCheck=true;
  817. row.searchFlag='Y'
  818. row.updateFlag='Y'
  819. row.downFlag='Y'
  820. row.deleteFlag='Y'
  821. }else {
  822. row.searchCheck=false;
  823. row.updateCheck=false;
  824. row.downCheck=false;
  825. row.deleteCheck=false;
  826. row.searchFlag='N'
  827. row.updateFlag='N'
  828. row.downFlag='N'
  829. row.deleteFlag='N'
  830. }
  831. },
  832. changeCheck(row,type){
  833. if(type==1){
  834. if(row.searchCheck){
  835. row.searchFlag='Y'
  836. }else {
  837. row.searchFlag='N'
  838. }
  839. }
  840. if(type==2){
  841. if(row.updateCheck){
  842. row.updateFlag='Y'
  843. }else {
  844. row.updateFlag='N'
  845. }
  846. }
  847. if(type==3){
  848. if(row.downCheck){
  849. row.downFlag='Y'
  850. }else {
  851. row.downFlag='N'
  852. }
  853. }
  854. if(type==4){
  855. if(row.deleteCheck){
  856. row.deleteFlag='Y'
  857. }else {
  858. row.deleteFlag='N'
  859. }
  860. }
  861. if(row.searchCheck && row.updateCheck && row.downCheck && row.deleteCheck){
  862. row.checkAll=true
  863. }else{
  864. row.checkAll=false
  865. }
  866. this.$forceUpdate();
  867. },
  868. // 表单提交
  869. dataFormSubmit () {
  870. this.$refs.saveForm.validate((validate) => {
  871. if (validate) {
  872. this.dataForm.updateBy = this.$store.state.user.name
  873. saveProjectInfo(this.dataForm).then(({data}) => {
  874. if (data && data.code === 0) {
  875. this.$message.success( '操作成功')
  876. this.visible = false
  877. this.$emit('refreshDataList', data.projectId)
  878. } else {
  879. this.$message.error(data.msg)
  880. }
  881. })
  882. } else {
  883. // if(!this.dataForm.projectTypeDb){
  884. // this.$alert('请选择项目类型!', '错误', {
  885. // confirmButtonText: '确定'
  886. // })
  887. // return false;
  888. // }
  889. if(!this.dataForm.customerId){
  890. this.$alert('请选择直接客户!', '错误', {
  891. confirmButtonText: '确定'
  892. })
  893. return false;
  894. }
  895. if(!this.dataForm.projectName){
  896. this.$alert('请输入项目名称!', '错误', {
  897. confirmButtonText: '确定'
  898. })
  899. return false;
  900. }
  901. // if(!this.dataForm.projectSource){
  902. // this.$alert('请选择项目来源!', '错误', {
  903. // confirmButtonText: '确定'
  904. // })
  905. // return false;
  906. // }
  907. // if(!this.dataForm.buDesc){
  908. // this.$alert('请选择BU!', '错误', {
  909. // confirmButtonText: '确定'
  910. // })
  911. // return false;
  912. // }
  913. // if(!this.dataForm.priority){
  914. // this.$alert('请选择优先级!', '错误', {
  915. // confirmButtonText: '确定'
  916. // })
  917. // return false;
  918. // }
  919. if(!this.dataForm.projectOwnerName){
  920. this.$alert('请选择项目审批人!', '错误', {
  921. confirmButtonText: '确定'
  922. })
  923. return false;
  924. }
  925. if(!this.dataForm.userRoleName){
  926. this.$alert('请选择权限!', '错误', {
  927. confirmButtonText: '确定'
  928. })
  929. return false;
  930. }
  931. }
  932. })
  933. },
  934. closeSaveDialog () {
  935. this.$refs.saveForm.resetFields();
  936. },
  937. isCurrentApprover () {
  938. return this.superAdmin || (this.dataForm.createBy2 && String(this.dataForm.createBy2).split(';').includes(this.createBy2))
  939. },
  940. canSaveAction () {
  941. if (this.dataForm.status === '已完成') {
  942. return false
  943. }
  944. if (!this.dataForm.status || this.dataForm.status === '草稿') {
  945. return true
  946. }
  947. return this.dataForm.status === '审批中' && this.isCurrentApprover()
  948. },
  949. canAgreeAction () {
  950. return this.authSubmit && this.isCurrentApprover() && this.dataForm.status === '审批中'
  951. },
  952. canRejectAction () {
  953. return this.authReject && this.isCurrentApprover() && this.dataForm.status === '审批中' && this.dataForm.isReject === 'Y'
  954. },
  955. projectFieldFlag (fieldId) {
  956. if (!this.plmProjectAuthorityArr || this.plmProjectAuthorityArr.length === 0) {
  957. return this.dataForm.id ? 'N' : 'Y'
  958. }
  959. let target = this.plmProjectAuthorityArr.find(item => item.fieldId === fieldId)
  960. return target ? target.updateFlag : 'N'
  961. },
  962. isProjectFieldDisabled (fieldId) {
  963. if (this.dataForm.status === '已完成') {
  964. return true
  965. }
  966. if (!this.dataForm.id) {
  967. return false
  968. }
  969. return this.projectFieldFlag(fieldId) === 'N'
  970. },
  971. plmProjectTeamArrFlag (fieldId) {
  972. if (!this.plmProjectTeamAuthorityArr) {
  973. return 'N'
  974. }
  975. let arr = this.plmProjectTeamAuthorityArr.filter(a => a.fieldId === fieldId)
  976. if (arr.length > 0) {
  977. return arr[0].updateFlag
  978. }
  979. return 'N'
  980. },
  981. isProjectTeamFieldDisabled (fieldId) {
  982. if (this.dataForm.status === '已完成') {
  983. return true
  984. }
  985. if (!this.dataForm.id || this.dataForm.status === '草稿') {
  986. return false
  987. }
  988. return this.plmProjectTeamArrFlag(fieldId) === 'N'
  989. },
  990. loadNodeAuthority (site, stepId) {
  991. if (!site || stepId === null || stepId === undefined || !this.menuId) {
  992. this.plmProjectAuthorityArr = []
  993. this.plmProjectTeamAuthorityArr = []
  994. this.nodeAuthorityLoaded = true
  995. return Promise.resolve()
  996. }
  997. this.nodeAuthorityLoaded = false
  998. return getNodeAuthority({
  999. site: site,
  1000. stepId: stepId,
  1001. menuId: this.menuId
  1002. }).then(({data}) => {
  1003. if (data && data.code === 0 && data.rows) {
  1004. this.plmProjectAuthorityArr = data.rows.plm_project_info || []
  1005. this.plmProjectTeamAuthorityArr = data.rows.plm_project_team || []
  1006. } else {
  1007. this.plmProjectAuthorityArr = []
  1008. this.plmProjectTeamAuthorityArr = []
  1009. }
  1010. this.nodeAuthorityLoaded = true
  1011. }).catch(() => {
  1012. this.plmProjectAuthorityArr = []
  1013. this.plmProjectTeamAuthorityArr = []
  1014. this.nodeAuthorityLoaded = true
  1015. })
  1016. },
  1017. validateSubmitRequiredFields () {
  1018. if (this.plmProjectAuthorityArr) {
  1019. for (let i = 0; i < this.plmProjectAuthorityArr.length; i++) {
  1020. const fieldConfig = this.plmProjectAuthorityArr[i]
  1021. if (fieldConfig.required !== 'Y') {
  1022. continue
  1023. }
  1024. const value = this.dataForm[fieldConfig.fieldId]
  1025. if (value === null || value === undefined || String(value).trim() === '') {
  1026. this.$message.warning((fieldConfig.fieldName || fieldConfig.fieldId) + '不能为空!')
  1027. return false
  1028. }
  1029. }
  1030. }
  1031. if (this.plmProjectTeamAuthorityArr) {
  1032. for (let i = 0; i < this.plmProjectTeamAuthorityArr.length; i++) {
  1033. const fieldConfig = this.plmProjectTeamAuthorityArr[i]
  1034. if (fieldConfig.required !== 'Y') {
  1035. continue
  1036. }
  1037. const value = this.dataForm[fieldConfig.fieldId]
  1038. if (!value || value.length === 0) {
  1039. this.$message.warning((fieldConfig.fieldName || fieldConfig.fieldId) + '不能为空!')
  1040. return false
  1041. }
  1042. }
  1043. }
  1044. return true
  1045. },
  1046. hasProjectManager () {
  1047. if (this.dataForm.projectManagerList && this.dataForm.projectManagerList.length > 0) {
  1048. return true
  1049. }
  1050. return !!(this.dataForm.projectManagerName && String(this.dataForm.projectManagerName).trim())
  1051. },
  1052. validateManagerRequiredFields () {
  1053. if (!this.hasProjectManager()) {
  1054. return true
  1055. }
  1056. const missing = []
  1057. if (this.dataForm.projectAmount === null || this.dataForm.projectAmount === undefined || String(this.dataForm.projectAmount).trim() === '') {
  1058. missing.push('项目年销售额CNY(K)')
  1059. }
  1060. if (!this.dataForm.finalCustomerId || String(this.dataForm.finalCustomerId).trim() === '') {
  1061. missing.push('直接客户')
  1062. }
  1063. if (!this.dataForm.customerRemark || String(this.dataForm.customerRemark).trim() === '') {
  1064. missing.push('客户应用/要求')
  1065. }
  1066. if (missing.length) {
  1067. this.$message.warning('项目经理不为空时,' + missing.join('、') + '不能为空')
  1068. return false
  1069. }
  1070. return true
  1071. },
  1072. agreeSubmit () {
  1073. if (!this.canAgreeAction()) {
  1074. this.$message.warning('当前状态不允许同意')
  1075. return
  1076. }
  1077. this.$confirm('确认同意该项目?', '提示', {
  1078. confirmButtonText: '确定',
  1079. cancelButtonText: '取消',
  1080. type: 'warning'
  1081. }).then(() => {
  1082. this.submitProject('Y')
  1083. })
  1084. },
  1085. openRejectModal () {
  1086. if (!this.canRejectAction()) {
  1087. this.$message.warning('当前状态不允许驳回')
  1088. return
  1089. }
  1090. if (!this.validateManagerRequiredFields()) {
  1091. return
  1092. }
  1093. this.rejectOpinion = ''
  1094. this.submitModalFlag = true
  1095. },
  1096. rejectSubmit () {
  1097. if (!this.rejectOpinion || !this.rejectOpinion.trim()) {
  1098. this.$message.warning('请填写驳回意见')
  1099. return
  1100. }
  1101. this.submitProject('N')
  1102. },
  1103. submitProject (nodeConclusion) {
  1104. if (!this.nodeAuthorityLoaded) {
  1105. this.$message.warning('节点权限加载中,请稍后重试')
  1106. return
  1107. }
  1108. if (!this.validateManagerRequiredFields()) {
  1109. return
  1110. }
  1111. if (nodeConclusion === 'Y' && !this.validateSubmitRequiredFields()) {
  1112. return
  1113. }
  1114. this.submitLoading = true
  1115. submitProjectInfo({
  1116. ...this.dataForm,
  1117. nodeConclusion: nodeConclusion,
  1118. rejectOpinion: this.rejectOpinion,
  1119. menuId: this.menuId
  1120. }).then(({data}) => {
  1121. this.submitLoading = false
  1122. if (data && data.code === 0) {
  1123. this.$message.success(nodeConclusion === 'Y' ? '同意成功' : '驳回成功')
  1124. this.submitModalFlag = false
  1125. this.visible = false
  1126. this.$emit('refreshDataList', this.dataForm.projectId)
  1127. } else {
  1128. this.$message.error((data && data.msg) || '提交失败')
  1129. }
  1130. }).catch(err => {
  1131. this.submitLoading = false
  1132. this.$message.error((err && err.message) || '提交失败')
  1133. })
  1134. },
  1135. updateDataForm (val) {
  1136. this.dataForm.projectId = val;
  1137. },
  1138. initCustomer (row) {
  1139. this.dataForm.customerId = row.customerId;
  1140. this.dataForm.customerName = row.customerName;
  1141. },
  1142. changeSaveCheckAll (val) {
  1143. for (let i = 0; i < this.userRoleList.length; i++) {
  1144. let row = this.userRoleList[i]
  1145. row.checkAll = (val === 'Y')
  1146. this.changeAll(row)
  1147. }
  1148. },
  1149. getCustomerName(type){
  1150. if(type===1){
  1151. let params = {
  1152. site:this.$store.state.user.site,
  1153. customerNo:this.dataForm.customerId
  1154. }
  1155. queryCustomer(params).then(({data})=>{
  1156. if (data && data.code === 0 ) {
  1157. if (data.rows && data.rows.length === 1){
  1158. this.dataForm.customerName = data.rows[0].customerDesc
  1159. }else {
  1160. this.dataForm.customerName = ''
  1161. }
  1162. }else {
  1163. this.$message.warning(data.msg)
  1164. }
  1165. }).catch((error)=>{
  1166. this.$message.error(error)
  1167. })
  1168. }
  1169. if(type===2){
  1170. let params = {
  1171. site:this.$store.state.user.site,
  1172. customerNo:this.dataForm.finalCustomerId
  1173. }
  1174. queryCustomer(params).then(({data})=>{
  1175. if (data && data.code === 0 ) {
  1176. if (data.rows && data.rows.length === 1){
  1177. this.dataForm.finalCustomerName = data.rows[0].customerDesc
  1178. }else {
  1179. this.dataForm.finalCustomerName = ''
  1180. }
  1181. }else {
  1182. this.$message.warning(data.msg)
  1183. }
  1184. }).catch((error)=>{
  1185. this.$message.error(error)
  1186. })
  1187. }
  1188. },
  1189. },
  1190. }
  1191. </script>
  1192. <style >
  1193. .el-transfer-panel {
  1194. border: 2px solid #17b3a3;
  1195. border-radius: 4px;
  1196. overflow: hidden;
  1197. background: #fff;
  1198. display: inline-block;
  1199. vertical-align: middle;
  1200. width: 200px;
  1201. max-height: 100%;
  1202. -webkit-box-sizing: border-box;
  1203. box-sizing: border-box;
  1204. position: relative;
  1205. }
  1206. .el-transfer-panel .el-transfer-panel__header {
  1207. height: 40px;
  1208. line-height: 40px;
  1209. background: #17b3a3;
  1210. margin: 0;
  1211. padding-left: 15px;
  1212. border-bottom: 1px solid #17b3a3;
  1213. -webkit-box-sizing: border-box;
  1214. box-sizing: border-box;
  1215. color: #000;
  1216. }
  1217. .el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label {
  1218. font-size: 14px;
  1219. color: #303133;
  1220. font-weight: 400;
  1221. }
  1222. .el-textarea .el-textarea__inner {
  1223. padding: 0px 5px;
  1224. height: auto;
  1225. }
  1226. .project-amount-form-item .el-form-item__label {
  1227. overflow: visible;
  1228. }
  1229. .project-amount-label {
  1230. display: inline-block;
  1231. width: 160px;
  1232. white-space: nowrap;
  1233. }
  1234. </style>