index.vue 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938
  1. <template>
  2. <section>
  3. <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
  4. <el-form :inline="true">
  5. <el-form-item :label="$t('he-tong-lie-biao')" class="toolbar_formitem_n1"></el-form-item>
  6. <!-- 合同编号/名称 -->
  7. <el-form-item>
  8. <div style="display: flex;align-items: center;height: 40px;">
  9. <el-input v-model="keyword" class="input-with-select" :placeholder="keyword == 1 ? $t('qing-shu-ru-he-tong-bian-hao') : $t('qing-shu-ru-he-tong-ming-cheng')" clearable size="small">
  10. <el-select slot="prepend" v-model="searchField" :placeholder="$t('defaultText.pleaseChoose')" style="width:120px">
  11. <el-option :label="$t('he-tong-ming-cheng')" :value="0"></el-option>
  12. <el-option :label="$t('contractno')" :value="1"></el-option>
  13. </el-select>
  14. <el-button slot="append" @click="searchFilter" 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('he-tong-lei-xing') }}</span>
  21. <el-select v-model="typeName" style="width:120px;" :placeholder="$t('defaultText.pleaseChoose')" @change="searchFilter" size="small" clearable>
  22. <el-option v-for="item in typeList" :key="item.id" :label="item.typeName" :value="item.id"></el-option>
  23. </el-select>
  24. </el-form-item>
  25. <!-- 状态 -->
  26. <el-form-item>
  27. <span style="margin-left:5px;margin-right:5px;color:#606266;">{{$t('state.states')}}</span>
  28. <el-select v-model="status" style="width:120px;" :placeholder="$t('defaultText.pleaseChoose')" @change="searchFilter" size="small" clearable>
  29. <el-option v-for="item,index in statusList" :key="item.label" :label="item.label" :value="index"></el-option>
  30. </el-select>
  31. </el-form-item>
  32. <!-- 创建时间 -->
  33. <el-form-item>
  34. <span style="margin-left:5px;margin-right:5px;color:#606266;">{{$t('creationtime')}}</span>
  35. <el-date-picker
  36. style="width:240px;"
  37. v-model="dateArray"
  38. type="daterange"
  39. size="small"
  40. range-separator="-"
  41. :start-placeholder="$t('interval')"
  42. :end-placeholder="$t('interval')"
  43. value-format="yyyy-MM-dd"
  44. clearable
  45. @change="searchFilter"
  46. ></el-date-picker>
  47. </el-form-item>
  48. <el-form-item style="float:right;">
  49. <el-dropdown>
  50. <el-link type="primary" :underline="false">{{$t('viewmore')}}<i class="el-icon-arrow-down el-icon--right"></i></el-link>
  51. <el-dropdown-menu slot="dropdown">
  52. <el-dropdown-item v-if="permissions.contractType"><el-link type="primary" :underline="false" @click="typeEdit()">{{$t('bian-ji') + $t('types')}}</el-link></el-dropdown-item>
  53. <el-dropdown-item v-if="permissions.contractImport"><el-link type="primary" :underline="false" @click="importDialog = true">{{$t('dao-ru')}}</el-link></el-dropdown-item>
  54. <el-dropdown-item v-if="permissions.contractExport"><el-link type="primary" :underline="false" @click="exportContract()">{{$t('export.export')}}</el-link></el-dropdown-item>
  55. </el-dropdown-menu>
  56. </el-dropdown>
  57. </el-form-item>
  58. <el-form-item style="float:right;" v-if="permissions.contractNew">
  59. <el-link type="primary" :underline="false" @click="newlyAdd()">{{ $t('xin-zeng-he-tong') }}</el-link>
  60. </el-form-item>
  61. </el-form>
  62. </el-col>
  63. <el-table :data="contractList" v-loading="listLoading" :height="tableHeight" border highlight-current-row>
  64. <el-table-column prop="number" :label="$t('contractno')" min-width="190"></el-table-column>
  65. <el-table-column prop="name" :label="$t('he-tong-ming-cheng')" min-width="190"></el-table-column>
  66. <el-table-column prop="amounts" :label="$t('contractamount')" min-width="130" align="right" header-align="center">
  67. <span slot-scope="scope">¥ {{scope.row.amounts ? scope.row.amounts.toFixed(2) : '0.00'}}</span>
  68. </el-table-column>
  69. <el-table-column prop="typeName" :label="$t('he-tong-lei-xing')" min-width="140" align="center"></el-table-column>
  70. <el-table-column prop="status" :label="$t('state.states')" min-width="100" align="center">
  71. <template slot-scope="scope">
  72. <span :style="statusList[scope.row.status].color">{{statusList[scope.row.status].label}}</span>
  73. </template>
  74. </el-table-column>
  75. <el-table-column prop="indate" :label="$t('creationtime')" min-width="100" align="center"></el-table-column>
  76. <el-table-column width="300" :label="$t('operation')" align="left" fixed="right">
  77. <template slot-scope="scope">
  78. <el-button v-if="permissions.contractView || permissions.contractManagement" size="mini" @click="lookover(scope.row)">{{$t('cha-kan')}}</el-button>
  79. <el-button v-if="permissions.contractManagement" size="mini" @click="editContract(scope.row)" type="primary">{{$t('bian-ji')}}</el-button>
  80. <el-button v-if="permissions.contractAudit && (scope.row.status == 1 || scope.row.status == 3)" size="mini" @click="process(scope.row,0)" type="success">{{$t('btn.through')}}</el-button>
  81. <el-button v-if="permissions.contractAudit && (scope.row.status == 1 || scope.row.status == 3)" size="mini" @click="processR(scope.row,2)" type="danger">{{$t('btn.rejected')}}</el-button>
  82. </template>
  83. </el-table-column>
  84. </el-table>
  85. <el-col :span="24" class="toolbar">
  86. <el-pagination
  87. @size-change="handleSizeChange"
  88. @current-change="handleCurrentChange"
  89. :page-sizes="[20 , 50 , 80 , 100]"
  90. :page-size="size"
  91. layout="total, sizes, prev, pager, next"
  92. :total="total"
  93. style="float:right;"
  94. ></el-pagination>
  95. </el-col>
  96. <el-dialog :title="dialogTitle + $t('he-tong')" :visible.sync="addDialog" v-if="addDialog" :close-on-click-modal="false" customClass="customWidth" width="900px">
  97. <div style="height: 72vh;overflow-y: auto;overflow-x: hidden;">
  98. <el-form ref="contractForm" :model="contractForm" :rules="rules" label-width="120px" class="contractForm">
  99. <el-form-item :label="$t('contractno')">
  100. <el-input v-model="contractForm.number" :maxlength="50" show-word-limit :placeholder="$t('peaseenterthe')" clearable></el-input>
  101. </el-form-item>
  102. <el-form-item :label="$t('he-tong-ming-cheng')" prop='name'>
  103. <el-input v-model="contractForm.name" :maxlength="100" show-word-limit :placeholder="$t('peaseenterthe')" clearable></el-input>
  104. </el-form-item>
  105. <el-form-item :label="$t('contractamount')">
  106. <el-input v-model="contractForm.amounts" id="contract_amount" :placeholder="$t('peaseenterthe')" @keyup.native="restrictNumber('contract_amount')" clearable>
  107. <span slot="prefix">¥</span>
  108. </el-input>
  109. </el-form-item>
  110. <el-form-item :label="$t('he-tong-lei-xing')">
  111. <el-select v-model="contractForm.typeId" :placeholder="$t('defaultText.pleaseChoose')" style="width:100%">
  112. <el-option v-for="item in typeList" :key="item.id" :label="item.typeName" :value="item.id"></el-option>
  113. </el-select>
  114. </el-form-item>
  115. <el-form-item :label="$t('schedulestarttime')">
  116. <el-date-picker
  117. v-model="contractForm.startDate"
  118. value-format="yyyy-MM-dd"
  119. type="date"
  120. :picker-options="{disabledDate: disabledStart}"
  121. :placeholder="$t('optiondate')">
  122. </el-date-picker>
  123. <span style="float:right;">{{$t('scheduleendtime')}}
  124. <el-date-picker
  125. style="margin-left: 15px;"
  126. v-model="contractForm.endDate"
  127. value-format="yyyy-MM-dd"
  128. type="date"
  129. :picker-options="{disabledDate: disabledEnd}"
  130. :placeholder="$t('optiondate')">
  131. </el-date-picker>
  132. </span>
  133. </el-form-item>
  134. <el-form-item :label="$t('bei-zhu')">
  135. <el-input v-model="contractForm.remarks" :placeholder="$t('peaseenterthe')" type="textarea" :rows="3" clearable></el-input>
  136. </el-form-item>
  137. <el-form-item label-width="0" class="contractFiles">
  138. <div class="contractFiles_title">{{ $t('fu-jian') }}
  139. <el-upload style="float:right;margin-right:5%;" ref="uploadFile" action="#" :http-request="httpRequest" :on-change="fileChange" :auto-upload="false" :show-file-list="false">
  140. <el-link type="primary">{{ $t('xin-zeng-fu-jian') }}</el-link>
  141. </el-upload>
  142. </div>
  143. <el-table :data="fileList" :header-cell-style="{'font-weight':'normal'}" highlight-current-row
  144. max-height="240" style="width: 100%;margin-top:10px;margin-bottom:15px">
  145. <el-table-column :label="$t('headerTop.serialNumber')" min-width="40" align="center">
  146. <template slot-scope="scope">
  147. <div>{{scope.$index + 1}}</div>
  148. </template>
  149. </el-table-column>
  150. <el-table-column :label="$t('filenames')" prop="name" min-width="140"></el-table-column>
  151. <!-- <el-table-column label="文件大小" min-width="60">
  152. <template slot-scope="scope">
  153. <div>{{scope.$index + 1}}</div>
  154. </template>
  155. </el-table-column> -->
  156. <el-table-column :label="$t('operation')" min-width="40">
  157. <template slot-scope="scope">
  158. <el-link @click="fileDelete(scope.row)" type="primary">{{$t('btn.delete')}}</el-link>
  159. </template>
  160. </el-table-column>
  161. </el-table>
  162. </el-form-item>
  163. </el-form>
  164. </div>
  165. <div slot="footer" class="dialog-footer;">
  166. <el-button @click.native="deleteContract()" style="float:left" v-if="dialogTitle == $t('bian-ji')">{{$t('btn.delete')}}</el-button>
  167. <el-button @click.native="addDialog = false">{{$t('btn.cancel')}}</el-button>
  168. <el-button type="primary" @click="submitInsert()" :loading="submitLoading">{{$t('btn.submit')}}</el-button>
  169. </div>
  170. </el-dialog>
  171. <el-dialog :title="$t('cha-kan-he-tong')" :visible.sync="lookoverDialog" v-if="lookoverDialog" :close-on-click-modal="false" customClass="customWidth" width="900px">
  172. <div style="height: 72vh;overflow-y: auto;overflow-x: hidden;">
  173. <el-form label-width="100px" class="lookoverContract clearfix">
  174. <el-form-item :label="$t('contractno')">
  175. {{contractForm.number}}
  176. </el-form-item>
  177. <el-form-item :label="$t('he-tong-ming-cheng')">
  178. {{contractForm.name}}
  179. </el-form-item>
  180. <el-form-item :label="$t('contractamount')">
  181. ¥ {{contractForm.amounts}}
  182. </el-form-item>
  183. <el-form-item :label="$t('he-tong-lei-xing')">
  184. {{contractForm.typeName}}
  185. </el-form-item>
  186. <el-form-item :label="$t('state.states')">
  187. {{statusList[contractForm.status].label}}
  188. </el-form-item>
  189. <el-form-item :label="$t('dismissreason')" v-if="contractForm.status == 2">
  190. <span v-if="userNameNeedTranslate == 1">
  191. <span><ww-open-data type='userName' :openid='contractForm.msg.name'></ww-open-data></span>
  192. <span>{{contractForm.msg.text}}</span>
  193. </span>
  194. <span v-else>
  195. {{contractForm.msg ? contractForm.msg : ''}}
  196. </span>
  197. </el-form-item>
  198. <el-form-item :label="$t('founder')">
  199. <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='contractForm.creatorName'></ww-open-data></span>
  200. <span v-else>{{contractForm.creatorName}}</span>
  201. </el-form-item>
  202. <el-form-item :label="$t('creationtime')">
  203. {{contractForm.indate}}
  204. </el-form-item>
  205. <el-form-item :label="$t('schedulestarttime')">
  206. {{contractForm.startDate}}
  207. </el-form-item>
  208. <el-form-item :label="$t('scheduleendtime')">
  209. {{contractForm.endDate}}
  210. </el-form-item>
  211. <el-form-item style="width:100%" :label="$t('bei-zhu')">
  212. {{contractForm.remarks}}
  213. </el-form-item>
  214. <el-form-item label-width="0" class="contractFiles">
  215. <div class="contractFiles_title">{{ $t('fu-jian') }}</div>
  216. <el-table :data="fileList" :header-cell-style="{'font-weight':'normal'}" highlight-current-row
  217. max-height="240" style="width: 100%;margin-top:10px;margin-bottom:30px">
  218. <el-table-column :label="$t('headerTop.serialNumber')" min-width="40" align="center">
  219. <template slot-scope="scope">
  220. <div>{{scope.$index + 1}}</div>
  221. </template>
  222. </el-table-column>
  223. <el-table-column :label="$t('filenames')" prop="name" min-width="140"></el-table-column>
  224. <!-- <el-table-column label="文件大小" min-width="60">
  225. <template slot-scope="scope">
  226. <div>{{scope.$index + 1}}</div>
  227. </template>
  228. </el-table-column> -->
  229. <el-table-column :label="$t('operation')" min-width="40">
  230. <template slot-scope="scope">
  231. <el-link @click="fileDownload(scope.row)" type="primary">{{$t('other.download')}}</el-link>
  232. </template>
  233. </el-table-column>
  234. </el-table>
  235. </el-form-item>
  236. </el-form>
  237. </div>
  238. </el-dialog>
  239. <el-dialog :title="$t('he-tong-lei-xing-guan-li')" :visible.sync="typeDialog" v-if="typeDialog" customClass="customWidth" width="500px">
  240. <el-table :data="typeList" highlight-current-row height="400" style="width: 100%;">
  241. <el-table-column type="index" width="60" :label="$t('headerTop.serialNumber')">
  242. <template slot-scope="scope">{{ scope.$index + 1 }}</template>
  243. </el-table-column>
  244. <el-table-column prop="typeName"></el-table-column>
  245. <el-table-column :label="$t('operation')" width="150">
  246. <template slot-scope="scope">
  247. <el-button size="small" type="primary" @click="typeItemEdit(scope.row)">{{$t('bian-ji')}}</el-button>
  248. <el-button size="small" type="danger" @click="typeItemDelete(scope.row)">{{$t('btn.delete')}}</el-button>
  249. </template>
  250. </el-table-column>
  251. </el-table>
  252. <div slot="footer" class="dialog-footer;">
  253. <el-button type="primary" @click="typeDialog = false">{{$t('Shutdown')}}</el-button>
  254. <el-button type="primary" @click="typeItemAdd()">{{ $t('xin-zeng-he-tong-lei-xing') }}</el-button>
  255. </div>
  256. <el-dialog :title="typeTitle == this.$t('add') ? $t('xin-zeng-he-tong-lei-xing') : $t('bian-ji-he-tong-lei-xing')" :visible.sync="typeItemDialog" v-if="typeItemDialog" append-to-body width="400px">
  257. <div style="height: 12vh;overflow-y: auto;overflow-x: hidden;">
  258. <el-input v-model="typeItemForm.typeName" :maxlength="200"></el-input>
  259. </div>
  260. <div slot="footer" class="dialog-footer;">
  261. <el-button type="primary" @click="typeItemDialog = false">{{$t('btn.cancel')}}</el-button>
  262. <el-button type="primary" @click="typeItemSubmit()">{{$t('btn.determine')}}</el-button>
  263. </div>
  264. </el-dialog>
  265. </el-dialog>
  266. <el-dialog :title="$t('dao-ru-he-tong')" :visible.sync="importDialog" v-if="importDialog" width="30%">
  267. <!-- 模板? -->
  268. <p>1. {{$t('other.download')}}
  269. <el-link type="primary" style="margin-left:5px;" :underline="false" :href="'./upload/'+$t('he-tong-guan-li-dao-ru-mo-ban')+'.xlsx'" :download="$t('he-tong-guan-li-dao-ru-mo-ban')+'.xlsx'">{{$t('he-tong-guan-li-dao-ru-mo-ban')+ '.xlsx'}}</el-link>
  270. </p>
  271. <div slot="footer" class="dialog-footer" style="text-align:center;">
  272. <el-upload ref="upload" action="#" :limit="1" :http-request="importContract" :show-file-list="false">
  273. <el-button type="primary" :loading="importLoading">{{ $t('dao-ru-he-tong') }}</el-button>
  274. </el-upload>
  275. </div>
  276. </el-dialog>
  277. <el-dialog :title="$t('defaultText.pleaseEnterTheReason')" v-if="denyReasonDialog" :visible.sync="denyReasonDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
  278. <div>
  279. <el-input type="textarea" v-model="denyReason" rows="2" :placeholder="$t('reasonforyourdecisiontoreject')" />
  280. </div>
  281. <div slot="footer" class="dialog-footer">
  282. <el-button @click="denyReasonDialog = false" >{{$t('btn.cancel')}}</el-button>
  283. <el-button type="primary" @click="process(null,2)" >{{$t('btn.submit')}}</el-button>
  284. </div>
  285. </el-dialog>
  286. </section>
  287. </template>
  288. <script>
  289. export default {
  290. data() {
  291. return {
  292. user: JSON.parse(sessionStorage.getItem("user")),
  293. permissions: JSON.parse(sessionStorage.getItem("permissions")),
  294. searchField: 0,
  295. keyword: '',
  296. typeName: '',
  297. status: '',
  298. dateArray: [],
  299. typeList: [],
  300. contractList: [],
  301. listLoading: false,
  302. statusList: [
  303. {label:this.$t('state.approved'),color: 'color:#67c23a;'},
  304. {label:this.$t('state.WaitingAudit'),color: 'color:#e6a23c;'},
  305. {label:this.$t('state.rejected'),color: 'color:#f56c6c;'},
  306. // {label:this.$t('other.importWaitingForReview'),color: 'color:#e6a23c;'},
  307. ],
  308. typeDialog: false,
  309. typeTitle: this.$t('add'),
  310. typeItemDialog: false,
  311. typeItemForm: {typeName: ''},
  312. denyReasonDialog: false,
  313. denyReason: '',
  314. denyrow: null,
  315. dialogTitle: this.$t('add'),
  316. addDialog: false,
  317. lookoverDialog: false,
  318. submitLoading: false,
  319. contractForm: {
  320. number: '',
  321. name: '',
  322. amounts: '',
  323. typeId: null,
  324. remarks: '',
  325. startDate: '',
  326. endDate: ''
  327. },
  328. rules:{
  329. name: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
  330. },
  331. fileList: [],
  332. importDialog: false,
  333. importLoading: false,
  334. page: 1,
  335. size: 20,
  336. total: 0,
  337. tableHeight: 0
  338. }
  339. },
  340. created() {
  341. let height = window.innerHeight;
  342. this.tableHeight = height - 180;
  343. const that = this;
  344. window.onresize = function temp() {
  345. that.tableHeight = window.innerHeight - 185;
  346. };
  347. },
  348. mounted() {
  349. this.getContractList()
  350. this.getContractType()
  351. },
  352. methods: {
  353. // test(row){
  354. // console.log('test',row);
  355. // // this.$refs.uploadFile.submit()
  356. // },
  357. restrictNumber(targetId) {
  358. let inpu = document.getElementById(targetId);
  359. inpu.value = inpu.value.replace(/[^\d.]/g, ""); //仅保留数字和"."
  360. inpu.value = inpu.value.replace(/\.{2,}/g, "."); //两个连续的"."仅保留第一个"."
  361. inpu.value = inpu.value.replace(".", "$#*").replace(/\./g,'').replace('$#*','.');//去除其他"."
  362. inpu.value = inpu.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2');;//限制只能输入两个小数
  363. if (inpu.value.indexOf(".") < 0 && inpu.value != "") { //首位是0的话去掉
  364. inpu.value = parseFloat(inpu.value);
  365. }
  366. if(inpu.value.split('.')[0].length > 9){
  367. inpu.value = inpu.value.split('.')[0].substring(0,9) + (inpu.value.split('.')[1] ? '.' + inpu.value.split('.')[1] : '')
  368. this.contractForm.amounts = inpu.value
  369. }
  370. },
  371. disabledStart(date){
  372. if(this.contractForm.endDate){
  373. if(date > new Date(this.contractForm.endDate)){
  374. return true
  375. }else{
  376. return false
  377. }
  378. }else{
  379. return false
  380. }
  381. },
  382. disabledEnd(date){
  383. if(this.contractForm.startDate){
  384. if(date < new Date(this.contractForm.startDate)){
  385. return true
  386. }else{
  387. return false
  388. }
  389. }else{
  390. return false
  391. }
  392. },
  393. searchFilter(){
  394. this.page = 1
  395. this.getContractList()
  396. },
  397. handleSizeChange(val){
  398. this.size = val
  399. this.page = 1
  400. this.getContractList()
  401. },
  402. handleCurrentChange(val){
  403. this.page = val;
  404. this.getContractList()
  405. },
  406. importContract(item){
  407. let str = item.file.name.split('.')
  408. let format = str[str.length - 1];
  409. if(format != "xls" && format != "xlsx"){
  410. this.$message({
  411. message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
  412. type: 'error'
  413. })
  414. }else{
  415. this.importLoading = true
  416. let formData = new FormData();
  417. formData.append("file", item.file);
  418. formData.append("userId", this.user.id);
  419. this.http.uploadFile('/contract/importContract',formData,
  420. res => {
  421. this.$refs.upload.clearFiles();
  422. this.importLoading = false;
  423. if(res.code == 'ok'){
  424. this.importDialog = false
  425. this.$message({
  426. message: this.$t('other.importSuccess'),
  427. type: 'success'
  428. })
  429. this.getContractList()
  430. }else{
  431. this.$message({
  432. message: res.msg,
  433. type: 'error'
  434. })
  435. }
  436. },err => {
  437. this.importLoading = false;
  438. this.$message({
  439. message: err,
  440. type: 'error'
  441. })
  442. })
  443. }
  444. },
  445. exportContract(){
  446. let parameter = {}
  447. if(this.typeName){
  448. parameter.typeName = this.typeName
  449. }
  450. if(this.keyword){
  451. if(this.searchField){
  452. parameter.number = this.keyword
  453. }else{
  454. parameter.name = this.keyword
  455. }
  456. }
  457. if(this.status !== ''){
  458. parameter.status = this.status
  459. }
  460. if(this.dateArray && this.dateArray.length == 2){
  461. parameter.startDate = this.dateArray[0]
  462. parameter.endDate = this.dateArray[1]
  463. }
  464. this.http.post('/contract/ExportContract',parameter,
  465. res => {
  466. if(res.code == 'ok'){
  467. let filePath = res.data;
  468. const a = document.createElement('a'); // 创建a标签
  469. a.setAttribute('download', this.$t('he-tong-dao-chu') + '.xlsx');// download属性
  470. a.setAttribute('href', filePath);// href链接
  471. a.click(); //自执行点击事件
  472. a.remove();
  473. }else{
  474. this.$message({
  475. message: res.msg,
  476. type: 'error'
  477. })
  478. }
  479. },err => {
  480. this.$message({
  481. message: err,
  482. type: 'error'
  483. })
  484. })
  485. },
  486. typeEdit(){
  487. this.typeDialog = true
  488. },
  489. typeItemAdd(){
  490. if(this.typeList.length == 20){
  491. this.$message({
  492. message: '合同类型最多只能创建20个',
  493. type: 'error'
  494. })
  495. return
  496. }
  497. this.typeTitle = this.$t('add')
  498. this.typeItemForm = {typeName: ''}
  499. this.typeItemDialog = true
  500. },
  501. typeItemEdit(row){
  502. this.typeTitle = this.$t('bian-ji')
  503. this.typeItemForm = JSON.parse(JSON.stringify(row))
  504. this.typeItemDialog = true
  505. },
  506. typeItemDelete(row){
  507. this.$confirm(this.$t('que-ding-yao-shan-chu-ci-tiao-he-tong-lei-xing-ma'), this.$t('other.prompts'), {
  508. confirmButtonText: this.$t('btn.determine'),
  509. cancelButtonText: this.$t('btn.cancel'),
  510. type: 'warning'
  511. }).then(() => {
  512. this.http.post('/contractType/deleteContractType',{
  513. deleteId: row.id
  514. },res => {
  515. if(res.code == 'ok'){
  516. this.getContractType()
  517. this.$message({
  518. type: 'success',
  519. message: this.$t('message.successfullyDeleted') + '!'
  520. });
  521. }else{
  522. this.$message({
  523. type: 'error',
  524. message: res.msg
  525. });
  526. }
  527. },err => {
  528. this.$message({
  529. type: 'error',
  530. message: err
  531. });
  532. })
  533. }).catch(() => {
  534. this.$message({
  535. type: 'info',
  536. message: this.$t('thedeletionhasbeencancelled')
  537. });
  538. });
  539. },
  540. typeItemSubmit(){
  541. this.http.post('/contractType/changeContractType',this.typeItemForm,
  542. res => {
  543. if(res.code == 'ok'){
  544. this.typeItemDialog = false
  545. this.getContractType()
  546. this.$message({
  547. message: this.typeTitle == this.$t('add') ? this.$t('newsuccess') : this.$t('editsuccess'),
  548. type: 'success'
  549. })
  550. }else{
  551. this.$message({
  552. message: res.msg,
  553. type: 'error'
  554. })
  555. }
  556. },err => {
  557. this.$message({
  558. message: err,
  559. type: 'error'
  560. })
  561. })
  562. },
  563. newlyAdd(){
  564. this.dialogTitle = this.$t('add')
  565. this.contractForm = {
  566. number: '',
  567. name: '',
  568. amounts: '',
  569. typeId: null,
  570. remarks: '',
  571. startDate: '',
  572. endDate: ''
  573. }
  574. this.fileList = []
  575. this.addDialog = true
  576. },
  577. editContract(row){
  578. this.dialogTitle = this.$t('bian-ji')
  579. this.contractForm = JSON.parse(JSON.stringify(row))
  580. this.fileList = this.contractForm.files ? this.contractForm.files : []
  581. for(let i in this.fileList){
  582. this.fileList[i].name = this.fileList[i].documentName
  583. }
  584. this.addDialog = true
  585. },
  586. deleteContract(){
  587. this.$confirm(this.$t('que-ding-yao-shan-chu-gai-he-tong-ma'), this.$t('other.prompts'), {
  588. confirmButtonText: this.$t('btn.determine'),
  589. cancelButtonText: this.$t('btn.cancel'),
  590. type: 'warning'
  591. }).then(() => {
  592. this.http.post('/contract/deleteContract',{
  593. id: this.contractForm.id
  594. },res => {
  595. if(res.code == 'ok'){
  596. this.addDialog = false
  597. this.getContractList()
  598. this.$message({
  599. type: 'success',
  600. message: this.$t('message.successfullyDeleted') + '!'
  601. });
  602. }else{
  603. this.$message({
  604. type: 'error',
  605. message: res.msg
  606. });
  607. }
  608. },err => {
  609. this.$message({
  610. type: 'error',
  611. message: err
  612. });
  613. })
  614. }).catch(() => {
  615. this.$message({
  616. type: 'info',
  617. message: this.$t('thedeletionhasbeencancelled')
  618. });
  619. });
  620. },
  621. processR(row,status){
  622. this.denyReasonDialog = true
  623. this.denyrowId = row.id
  624. this.denyReason = ''
  625. },
  626. process(row,status){
  627. let parameter
  628. if(status == 2){
  629. parameter = {
  630. id: this.denyrowId,
  631. status: status,
  632. msg: this.denyReason
  633. }
  634. }else{
  635. parameter = {
  636. id: row.id,
  637. status: status
  638. }
  639. }
  640. this.http.post('/contract/processContract',parameter,
  641. res => {
  642. if(res.code == 'ok'){
  643. this.getContractList()
  644. this.denyReasonDialog = false
  645. this.$message({
  646. message: status == 0 ? this.$t('state.alreadyPassed') : this.$t('state.rejected'),
  647. type: 'success'
  648. })
  649. }else{
  650. this.$message({
  651. message: res.msg,
  652. type: 'error'
  653. })
  654. }
  655. },err => {
  656. this.$message({
  657. message: err,
  658. type: 'error'
  659. })
  660. })
  661. },
  662. lookover(row){
  663. // console.log('lookover',row);
  664. if(this.user.userNameNeedTranslate == 1) {
  665. let obj = {name: '',text: ''}
  666. if(row.msg.indexOf('$userName=') != '-1') {
  667. let str = row.msg.split('$userName=')[1]
  668. let arr = str.split('$')
  669. obj.name = arr[0]
  670. obj.text = arr[1]
  671. } else {
  672. obj.text = row.msg
  673. }
  674. row.msg = obj
  675. this.contractForm = row
  676. } else {
  677. this.contractForm = row
  678. }
  679. this.fileList = this.contractForm.files ? this.contractForm.files : []
  680. for(let i in this.fileList){
  681. this.fileList[i].name = this.fileList[i].documentName
  682. }
  683. this.lookoverDialog = true
  684. },
  685. submitInsert(){
  686. this.$refs.contractForm.validate(valid => {
  687. if (valid) {
  688. this.submitLoading = true
  689. delete this.contractForm.files
  690. this.http.post(this.dialogTitle == this.$t('add') ? '/contract/addContract' : '/contract/editContract',this.contractForm,
  691. res => {
  692. this.submitLoading = false
  693. this.addDialog = false
  694. if(res.code == 'ok'){
  695. this.$message({
  696. message: res.msg,
  697. type: 'success'
  698. })
  699. if(this.dialogTitle == this.$t('add')){
  700. this.contractForm.id = res.data
  701. }
  702. this.submitFile()
  703. }else{
  704. this.$message({
  705. message: res.msg,
  706. type: 'error'
  707. })
  708. }
  709. },err => {
  710. this.submitLoading = false
  711. this.addDialog = false
  712. this.$message({
  713. message: err,
  714. type: 'error'
  715. })
  716. })
  717. }
  718. })
  719. },
  720. fileChange(file,fileList){
  721. // console.log('fileChange',file,fileList);
  722. file.needUpload = true
  723. this.fileList.push(file)
  724. },
  725. fileDelete(row){
  726. // console.log(row,this.fileList);
  727. this.$confirm(this.$t('que-ding-yao-shan-chu-gai-wen-jian-ma'), this.$t('other.prompts'), {
  728. confirmButtonText: this.$t('btn.determine'),
  729. cancelButtonText: this.$t('btn.cancel'),
  730. type: 'warning'
  731. }).then(() => {
  732. if(row.uid){
  733. for(let i in this.fileList){
  734. if(this.fileList[i].uid && this.fileList[i].uid == row.uid){
  735. this.fileList.splice(i,1)
  736. }
  737. }
  738. }else{
  739. this.http.post('/contract-document/fileDelete',{
  740. contractId: this.contractForm.id,
  741. fileIds: [row.id]
  742. },res => {
  743. if(res.code == 'ok'){
  744. this.getContractList()
  745. this.fileList.filter(item => !item.id || item.id != row.id)
  746. this.$message({
  747. type: 'success',
  748. message: this.$t('message.successfullyDeleted') + '!'
  749. });
  750. }else{
  751. this.$message({
  752. type: 'error',
  753. message: res.msg
  754. });
  755. }
  756. },err => {
  757. this.$message({
  758. type: 'error',
  759. message: err
  760. });
  761. })
  762. }
  763. }).catch(() => {
  764. this.$message({
  765. type: 'info',
  766. message: this.$t('thedeletionhasbeencancelled')
  767. });
  768. });
  769. },
  770. fileDownload(row){
  771. this.http.downloadFile('/contract-document/fileDown',{
  772. contractId: this.contractForm.id,
  773. fileId: row.id
  774. },row.name,err=>{
  775. this.$message({
  776. message: err,
  777. type: 'error'
  778. })
  779. })
  780. },
  781. submitFile(){
  782. // console.log('submitFile',this.fileList);
  783. let formData = new FormData();
  784. for(let i in this.fileList){
  785. if(this.fileList[i].needUpload){
  786. formData.append("file", this.fileList[i].raw);
  787. }
  788. }
  789. formData.append("ContractId", this.contractForm.id);
  790. this.http.uploadFile('/contract-document/fileUpload',formData,
  791. res => {
  792. if(res.code == 'ok'){
  793. this.getContractList()
  794. }else{
  795. this.$message({
  796. message: res.msg,
  797. type: 'error'
  798. })
  799. }
  800. },err => {
  801. this.$message({
  802. message: err,
  803. type: 'error'
  804. })
  805. })
  806. },
  807. getContractType(){
  808. this.http.post('/contractType/getContractType',{},
  809. res=>{
  810. if(res.code=='ok'){
  811. this.typeList = res.data
  812. }else{
  813. this.$message({
  814. message: res.msg,
  815. type: 'error'
  816. })
  817. }
  818. },err=>{
  819. this.$message({
  820. message: err,
  821. type: 'error'
  822. })
  823. })
  824. },
  825. getContractList(){
  826. // pageIndex,pageSize,number,name,typeName,status,startDate,endDate
  827. let parameter = {
  828. pageIndex: this.page,
  829. pageSize: this.size,
  830. }
  831. if(this.typeName){
  832. parameter.typeName = this.typeName
  833. }
  834. if(this.keyword){
  835. if(this.searchField){
  836. parameter.number = this.keyword
  837. }else{
  838. parameter.name = this.keyword
  839. }
  840. }
  841. if(this.status !== ''){
  842. parameter.status = this.status
  843. }
  844. if(this.dateArray && this.dateArray.length == 2){
  845. parameter.startDate = this.dateArray[0]
  846. parameter.endDate = this.dateArray[1]
  847. }
  848. this.listLoading = true
  849. this.http.post('/contract/getContractPage',parameter,
  850. res => {
  851. this.listLoading = false
  852. if(res.code == 'ok'){
  853. this.contractList = res.data.data
  854. this.total = res.data.total
  855. }else{
  856. this.$message({
  857. message: res.msg,
  858. type: 'error'
  859. })
  860. }
  861. },err => {
  862. this.listLoading = false
  863. this.$message({
  864. message: err,
  865. type: 'error'
  866. })
  867. })
  868. }
  869. },
  870. }
  871. </script>
  872. <style>
  873. .lookoverContract{
  874. margin-top: 30px;
  875. }
  876. .lookoverContract .el-form-item{
  877. width: 50%;
  878. float: left;
  879. }
  880. .lookoverContract .el-form-item__label{
  881. font-weight: 600;
  882. }
  883. .lookoverContract .contractFiles{
  884. width: 100%;
  885. }
  886. .lookoverContract .contractFiles_title{
  887. margin-left: 5%;
  888. font-size: 16px;
  889. line-height: 20px;
  890. margin-top: 16px;
  891. }
  892. .contractForm{
  893. margin-top: 30px;
  894. }
  895. .contractForm .el-form-item{
  896. width: 90%;
  897. }
  898. .contractForm .contractFiles{
  899. width: 100%;
  900. }
  901. .contractForm .contractFiles_title{
  902. margin-left: 5%;
  903. font-size: 16px;
  904. line-height: 20px;
  905. margin-top: 16px;
  906. }
  907. </style>