projectApproval.vue 82 KB

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