repertory.vue 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233
  1. <template>
  2. <div class="p20">
  3. <!-- 功能区 -->
  4. <el-card class="box-card">
  5. <el-row>
  6. <el-col :span="6">
  7. <el-text class="">关键词:</el-text>
  8. <el-input class="width160" placeholder="请输入关键词" v-model="data.params.keyword"
  9. @keyup.enter.native="getList"> </el-input>
  10. <el-button type="primary" class="ml10" @click="getList">
  11. <el-icon>
  12. <ele-Search />
  13. </el-icon>
  14. 查询
  15. </el-button>
  16. </el-col>
  17. <el-col :span="12" class="tr">
  18. <el-form-item label="创建时间:">
  19. <el-date-picker v-model="data.params.create_time_begin_time" type="datetime" placeholder="开始创建时间"
  20. format="YYYY/MM/DD HH:mm:ss" />
  21. <div class="ml5 mr5">To</div>
  22. <el-date-picker v-model="data.params.create_time_end_time" type="datetime" placeholder="结束创建时间"
  23. format="YYYY-MM-DD HH:mm:ss" />
  24. <el-button type="primary" class="ml10" @click="getList">
  25. <el-icon>
  26. <ele-Search />
  27. </el-icon>
  28. 查询
  29. </el-button>
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="6" class="tr">
  33. <el-button type="primary" @click="addstatus">新增状态</el-button>
  34. <el-button type="primary" @click="editstatus">更新状态</el-button>
  35. <el-button type="primary" @click="addPage">新增</el-button>
  36. </el-col>
  37. </el-row>
  38. <el-row>
  39. <el-col :span="6">
  40. <el-text class="">负责人:</el-text>
  41. <el-select class="width160" v-model="data.params.responsibility_person_id" clearable
  42. placeholder="请选择负责人" @change="getList">
  43. <el-option :label="item.real_name" :value="item.id" v-for="item in data.repertoryList" />
  44. </el-select>
  45. </el-col>
  46. <el-col :span="6" class="tr">
  47. <el-form-item label="状态:">
  48. <el-select v-model="data.params.status" multiple placeholder="选择状态" @change="getList"
  49. style="width: 180px">
  50. <el-option :label="item[1]" :value="item[0]" v-for="item in statusList.data" />
  51. </el-select>
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="6" class="tr">
  55. <el-form-item label="最小金额:">
  56. <el-input type="number" class="width200" placeholder="请输入最小金额" v-model="data.params.min_amount"
  57. @keyup.enter.native="getList">
  58. <template #append>元</template>
  59. </el-input>
  60. </el-form-item>
  61. </el-col>
  62. <el-col :span="6" class="tr">
  63. <el-form-item label="最大金额:">
  64. <el-input type="number" class="width200" placeholder="请输入最大金额" v-model="data.params.max_amount"
  65. @keyup.enter.native="getList">
  66. <template #append>元</template>
  67. </el-input>
  68. </el-form-item>
  69. </el-col>
  70. </el-row>
  71. <el-row>
  72. <el-col :span="6" class="tr">
  73. <el-form-item label="最小维护时间:">
  74. <el-input type="number" class="width220" placeholder="请输入最小维护时间"
  75. v-model="data.params.min_maintain_time_days" @keyup.enter.native="getList"><template
  76. #append>天</template> </el-input>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="6" class="tr">
  80. <el-form-item label="最大维护时间:">
  81. <el-input type="number" class="width220" placeholder="请输入最大维护时间"
  82. v-model="data.params.max_maintain_time_days" @keyup.enter.native="getList"><template
  83. #append>天</template> </el-input>
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="6" class="tr">
  87. <el-form-item label="最小开发时间:">
  88. <el-input type="number" class="width220" placeholder="请输入最小开发时间"
  89. v-model="data.params.min_dev_time_days" @keyup.enter.native="getList"><template
  90. #append>天</template> </el-input>
  91. </el-form-item>
  92. </el-col>
  93. <el-col :span="6" class="tr">
  94. <el-form-item label="最大开发时间:">
  95. <el-input type="number" class="width220" placeholder="请输入最大开发时间"
  96. v-model="data.params.max_dev_time_days" @keyup.enter.native="getList"><template
  97. #append>天</template> </el-input>
  98. </el-form-item>
  99. </el-col>
  100. </el-row>
  101. </el-card>
  102. <!-- 主体区 -->
  103. <el-card class="box-card mt20" v-loading="data.loading">
  104. <!-- 列表 -->
  105. <el-table :data="data.tableData" @selection-change="handleTableDataSelectionChange">
  106. <el-table-column prop="name" label="项目名称" width="150" />
  107. <el-table-column prop="create_time" label="创建时间" width="" />
  108. <el-table-column prop="responsibility_person" label="责任人" width="" />
  109. <el-table-column prop="source" label="来源" width="" />
  110. <el-table-column prop="status" label="状态" width="">
  111. <template #default="scope">
  112. {{ statusList.data.get(scope.row.status) }}
  113. </template>
  114. </el-table-column>
  115. <el-table-column fixed="right" label="操作" width="250">
  116. <template #default="scope">
  117. <el-button link type="primary" @click="edit(scope.row)">更新</el-button>
  118. <el-button link type="primary" @click="openDetail(scope.row)">详情</el-button>
  119. <el-button link type="primary" @click="openContract(scope.row)">查看合同</el-button>
  120. <el-button link type="danger" @click="deleteOne(scope.row)">删除</el-button>
  121. </template>
  122. </el-table-column>
  123. </el-table>
  124. <!-- 分页 -->
  125. <div class="yc_pagebox">
  126. <el-pagination v-model:current-page="data.pagination.currentPage"
  127. v-model:page-size="data.pagination.pageSize" :page-sizes="getThemeConfig.pageSizeArray"
  128. layout="total, sizes, prev, pager, next, jumper" :total="data.pagination.total"
  129. @size-change="handleSizeChange" @current-change="handleCurrentChange" />
  130. </div>
  131. </el-card>
  132. <!-- 弹出项目 新增,更新的页面-->
  133. <el-dialog width="1200px" v-if="data.dialog.show" v-model="data.dialog.show" :title="data.dialog.title"
  134. @close="closePage">
  135. <el-form :model="data.form" label-width="120px" ref="formRef" v-loading="data.dialog.isLoading">
  136. <el-row :gutter="20">
  137. <el-col :span="12">
  138. <el-form-item label="项目名称" prop="name"
  139. :rules="[{ required: true, message: '请填写项目名称', trigger: 'blur' }]">
  140. <el-input v-model="data.form.name" placeholder="项目名称" />
  141. </el-form-item>
  142. <el-form-item label="来源" prop="source"
  143. :rules="[{ required: true, message: '填写来源', trigger: 'blur' }]">
  144. <el-input v-model="data.form.source" placeholder="填写来源" />
  145. </el-form-item>
  146. <el-form-item label="预估金额" prop="estimated_amount"
  147. :rules="[{ required: true, message: '填写预估金额', trigger: 'blur' }]">
  148. <el-input type="number" v-model="data.form.estimated_amount" placeholder="填写预估金额">
  149. <template #append>元</template>
  150. </el-input>
  151. </el-form-item>
  152. <el-form-item label="约定开发周期/天" prop="pre_dev_time">
  153. <el-input type="number" v-model="data.form.pre_dev_time" placeholder="填写约定开发周期/天">
  154. <template #append>天</template>
  155. </el-input>
  156. </el-form-item>
  157. <el-form-item label="约定维护周期/天" prop="pre_maintain_time">
  158. <el-input type="number" v-model="data.form.pre_maintain_time" placeholder="填写约定维护周期/天">
  159. <template #append>天</template>
  160. </el-input>
  161. </el-form-item>
  162. <el-form-item label="责任人" prop="responsibility_person_id"
  163. :rules="[{ required: true, message: '填写责任人', trigger: 'blur' }]">
  164. <el-select v-model="data.form.responsibility_person_id" placeholder="选择责任人">
  165. <el-option :label="item.real_name" :value="item.id" v-for="item in data.repertoryList" />
  166. </el-select>
  167. </el-form-item>
  168. <el-form-item label="参与人员" prop="participants_id"
  169. :rules="[{ required: true, message: '填写参与人员', trigger: 'blur' }]">
  170. <el-select v-model="data.form.participants_id" multiple placeholder="选择参与人员" clearable
  171. filterable :style="{ width: '70%' }">
  172. <el-option v-for="item in data.repertoryList" :key="item.id" :label="item.real_name"
  173. :value="item.id" />
  174. </el-select>
  175. </el-form-item>
  176. <el-form-item label="状态" prop="status"
  177. :rules="[{ required: true, message: '请选择状态', trigger: 'blur' }]">
  178. <el-select v-model="data.form.status" placeholder="选择状态">
  179. <el-option :label="item[1]" :value="item[0]" v-for="item in statusList.data" />
  180. </el-select>
  181. </el-form-item>
  182. </el-col>
  183. <el-col :span="12">
  184. <el-form-item label="项目开始时间" prop="project_start_date">
  185. <el-date-picker v-model="data.form.project_start_date" type="project_start_date"
  186. placeholder=" 填写项目开始时间" value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  187. </el-form-item>
  188. <el-form-item label="项目结束时间" prop="project_end_date">
  189. <el-date-picker v-model="data.form.project_end_date" type="project_end_date"
  190. placeholder="填写项目结束时间" value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  191. </el-form-item>
  192. <el-form-item label="开发开始时间" prop="dev_start_date">
  193. <el-date-picker v-model="data.form.dev_start_date" type="dev_start_date" placeholder=" 填写开发开始时间"
  194. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  195. </el-form-item>
  196. <el-form-item label="开发结束时间" prop="dev_end_date">
  197. <el-date-picker v-model="data.form.dev_end_date" type="dev_end_date" placeholder=" 填写开发结束时间"
  198. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  199. </el-form-item>
  200. <el-form-item label="维护开始时间" prop="maintain_start_date">
  201. <el-date-picker v-model="data.form.maintain_start_date" type="maintain_start_date"
  202. placeholder=" 填写维护开始时间" value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  203. </el-form-item>
  204. <el-form-item label="维护结束时间" prop="maintain_end_date">
  205. <el-date-picker v-model="data.form.maintain_end_date" type="maintain_end_date"
  206. placeholder=" 填写维护结束时间" value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  207. </el-form-item>
  208. </el-col>
  209. </el-row>
  210. </el-form>
  211. <div class="height20"></div>
  212. <template #footer>
  213. <el-button type="default" @click="closePage">取消</el-button>
  214. <el-button type="primary" @click="submitForm(formRef)">提交</el-button>
  215. </template>
  216. </el-dialog>
  217. <!-- 弹出项目详情-->
  218. <vuecmf-dialog width="800px" :model_value="data.dialogDetail.showDetail" :title="data.dialogDetail.titleDetail"
  219. @close="closePage">
  220. <template #content>
  221. <el-row>
  222. <el-col :span="10">
  223. <div style="position: fixed">
  224. <h3 class="mb20">项目详情表:</h3>
  225. <div m="4" class="ml20">
  226. <p class="mt10" m="t-0 b-2" style="display: flex;">
  227. 项目参与人员:{{ data.form.participants?.join(',') }}</p>
  228. <p class="mt10" m="t-0 b-2">预估金额:
  229. <money :money="data.form.estimated_amount" />
  230. </p>
  231. <p class="mt10" m="t-0 b-2">约定开发周期: {{ data.form.pre_dev_time ?
  232. data.form.pre_dev_time : '暂无数据' }} 天</p>
  233. <p class="mt10" m="t-0 b-2">约定维护周期: {{ data.form.pre_maintain_time ?
  234. data.form.pre_maintain_time : '暂无数据' }} 天</p>
  235. <p class="mt10" m="t-0 b-2">项目周期开始时间: {{ data.form.project_start_date ?
  236. data.form.project_start_date : '暂无数据' }}</p>
  237. <p class="mt10" m="t-0 b-2">项目周期结束时间: {{ data.form.project_end_date
  238. ? data.form.project_end_date : '暂无数据' }}</p>
  239. <p class="mt10" m="t-0 b-2">开发开始时间: {{ data.form.dev_start_date
  240. ? data.form.dev_start_date : '暂无数据' }}</p>
  241. <p class="mt10" m="t-0 b-2">开发结束时间: {{ data.form.dev_end_date
  242. ? data.form.dev_end_date : '暂无数据' }}</p>
  243. <p class="mt10" m="t-0 b-2">维护开始时间: {{ data.form.maintain_start_date ?
  244. data.form.maintain_start_date : '暂无数据' }}</p>
  245. <p class="mt10" m="t-0 b-2">维护结束时间: {{ data.form.maintain_end_date
  246. ? data.form.maintain_end_date : '暂无数据' }}</p>
  247. </div>
  248. </div>
  249. </el-col>
  250. <el-col :span="14">
  251. <div style="height: 500px">
  252. <el-timeline>
  253. <el-timeline-item v-for="item in data.form.schedules" :timestamp="item.start_date"
  254. placement="top">
  255. <div v-for="items in data.stalist" class="ml5 mb10">
  256. <h3 v-if="item.status == items.key">{{ items.value }}</h3>
  257. </div>
  258. <el-card>
  259. <h3>{{ item.name }}</h3>
  260. <h4 class="mt5 mb10">{{ item.desc }}</h4>
  261. <p class=" mb10">{{ item.updater }}</p>
  262. <div class="text mb10">结束时间:{{ item.end_date }}</div>
  263. <div class="text">
  264. <el-button type="primary" @click="editSchedule(item)">编辑进度</el-button>
  265. <el-button type="danger" @click="deleteSchedule(item)">删除进度</el-button>
  266. </div>
  267. </el-card>
  268. </el-timeline-item>
  269. <el-timeline-item>
  270. <div class="flex justify-space-between mb-4 flex-wrap gap-4">
  271. <el-button type="primary" text @click="newSchedule(data.form)">新建进度</el-button>
  272. </div>
  273. </el-timeline-item>
  274. </el-timeline>
  275. </div>
  276. </el-col>
  277. </el-row>
  278. <div class="height20"></div>
  279. </template>
  280. </vuecmf-dialog>
  281. <!-- 弹出项目进度新增页面-->
  282. <vuecmf-dialog width="500px" :model_value="data.schedule.show" :title="data.schedule.title"
  283. @close="closeSchedulePage">
  284. <template #content>
  285. <el-form :model="data.formList" label-width="140px" ref="formRef" v-loading="data.schedule.isLoading">
  286. <el-form-item label="进度名称" prop="name"
  287. :rules="[{ required: true, message: '请填写进度名称', trigger: 'blur' }]">
  288. <el-input v-model="data.formList.name" placeholder="进度名称" />
  289. </el-form-item>
  290. <el-form-item label="进度内容" prop="desc"
  291. :rules="[{ required: true, message: '请填写进度内容', trigger: 'blur' }]">
  292. <el-input v-model="data.formList.desc" placeholder="进度内容" />
  293. </el-form-item>
  294. <el-form-item label="进度负责人" prop="updater_id"
  295. :rules="[{ required: true, message: '选择进度负责人', trigger: 'blur' }]">
  296. <el-select v-model="data.formList.updater_id" placeholder="选择进度负责人">
  297. <el-option :label="item.real_name" :value="item.id" v-for="item in data.repertoryList" />
  298. </el-select>
  299. </el-form-item>
  300. <el-form-item label="开始时间" prop="start_date">
  301. <el-date-picker v-model="data.formList.start_date" type="start_date" placeholder=" 填写开始时间"
  302. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  303. </el-form-item>
  304. <el-form-item label="结束时间" prop="end_date">
  305. <el-date-picker v-model="data.formList.end_date" type="end_date" placeholder=" 填写结束时间"
  306. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  307. </el-form-item>
  308. <el-form-item label="进度状态" prop="status"
  309. :rules="[{ required: true, message: '请选择状态', trigger: 'blur' }]">
  310. <el-select v-model="data.formList.status" placeholder="选择状态">
  311. <el-option :label="item.value" :value="item.key" v-for="item in data.stalist" />
  312. </el-select>
  313. </el-form-item>
  314. <el-form-item label="是否更新项目状态" prop="is_update_project_status"
  315. :rules="[{ required: true, message: '请更新状态', trigger: 'change' }]">
  316. <el-switch v-model="data.formList.is_update_project_status" class="ml-2" :active-value="1"
  317. :inactive-value="0" />
  318. </el-form-item>
  319. <el-form-item v-show="data.formList.is_update_project_status" label="完成后项目状态"
  320. prop="finish_project_status"
  321. :rules="[{ required: !!data.formList.is_update_project_status, message: '请选择完成状态', trigger: 'change' }]">
  322. <el-select v-model="data.formList.finish_project_status" placeholder="选择完成状态">
  323. <el-option :label="item[1]" :value="item[0]" v-for="item in statusList.data" />
  324. </el-select>
  325. </el-form-item>
  326. <el-form-item v-show="data.formList.is_update_project_status" label="进行中项目状态"
  327. prop="going_project_status">
  328. <el-select v-model="data.formList.going_project_status" placeholder="选择进行中状态">
  329. <el-option :label="item[1]" :value="item[0]" v-for="item in statusList.data" />
  330. </el-select>
  331. </el-form-item>
  332. </el-form>
  333. <div class="height20"></div>
  334. </template>
  335. <template #footer>
  336. <el-button type="default" @click="closeSchedulePage">取消</el-button>
  337. <el-button type="success" @click="submitSchedule(formRef)">提交</el-button>
  338. </template>
  339. </vuecmf-dialog>
  340. <!-- 弹出项目进度更新页面-->
  341. <vuecmf-dialog width="500px" :model_value="data.scheduleup.show" :title="data.scheduleup.title"
  342. @close="closeSchedulePage">
  343. <template #content>
  344. <el-form :model="data.formList" label-width="140px" ref="formRef" v-loading="data.scheduleup.isLoading">
  345. <el-form-item label="进度名称" prop="name"
  346. :rules="[{ required: true, message: '请填写进度名称', trigger: 'blur' }]">
  347. <el-input v-model="data.formList.name" placeholder="进度名称" />
  348. </el-form-item>
  349. <el-form-item label="进度内容" prop="desc"
  350. :rules="[{ required: true, message: '请填写进度内容', trigger: 'blur' }]">
  351. <el-input v-model="data.formList.desc" placeholder="进度内容" />
  352. </el-form-item>
  353. <el-form-item label="进度负责人" prop="updater_id"
  354. :rules="[{ required: true, message: '选择进度负责人', trigger: 'blur' }]">
  355. <el-select v-model="data.formList.updater_id" placeholder="选择进度负责人">
  356. <el-option :label="item.real_name" :value="item.id" v-for="item in data.repertoryList" />
  357. </el-select>
  358. </el-form-item>
  359. <el-form-item label="开始时间" prop="start_date">
  360. <el-date-picker v-model="data.formList.start_date" type="start_date" placeholder=" 填写开始时间"
  361. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  362. </el-form-item>
  363. <el-form-item label="结束时间" prop="end_date">
  364. <el-date-picker v-model="data.formList.end_date" type="end_date" placeholder=" 填写结束时间"
  365. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  366. </el-form-item>
  367. <el-form-item label="状态" prop="status" :rules="[{ required: true, message: '请选择状态', trigger: 'blur' }]">
  368. <el-select v-model="data.formList.status" placeholder="选择状态">
  369. <el-option :label="item.value" :value="item.key" v-for="item in data.stalist" />
  370. </el-select>
  371. </el-form-item>
  372. <el-form-item label="是否更新项目状态" prop="is_update_project_status"
  373. :rules="{ required: true, message: '请更新状态', trigger: 'blur' }">
  374. <el-switch v-model="data.formList.is_update_project_status" class="ml-2" :active-value="1"
  375. :inactive-value="0" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949" />
  376. </el-form-item>
  377. <el-form-item v-show="data.formList.is_update_project_status" label="结束后项目状态"
  378. prop="finish_project_status"
  379. :rules="{ required: data.formList.is_update_project_status, message: '请选择结束状态', trigger: 'change' }">
  380. <el-select v-model="data.formList.finish_project_status" placeholder="选择结束状态">
  381. <el-option :label="item[1]" :value="item[0]" v-for="item in statusList.data" />
  382. </el-select>
  383. </el-form-item>
  384. <el-form-item v-show="data.formList.is_update_project_status" label="进行中项目状态"
  385. prop="going_project_status">
  386. <el-select v-model="data.formList.going_project_status" placeholder="选择进行中状态">
  387. <el-option :label="item[1]" :value="item[0]" v-for="item in statusList.data" />
  388. </el-select>
  389. </el-form-item>
  390. </el-form>
  391. <div class="height20"></div>
  392. </template>
  393. <template #footer>
  394. <el-button type="default" @click="closeSchedulePage">取消</el-button>
  395. <el-button type="primary" @click="submitScheduleUpdate()">更新</el-button>
  396. </template>
  397. </vuecmf-dialog>
  398. <!-- 弹出查看合同详情-->
  399. <vuecmf-dialog width="1200px" :model_value="data.contractDetail.showDetail" :title="data.contractDetail.titleDetail"
  400. @close="closePage">
  401. <template #content>
  402. <el-form :model="data.tableContract" inline-message="true" v-loading="data.contractDetail.isLoadingDetail">
  403. <el-table :data="data.tableContract" stripe style="width: 100%" label-width="120px">
  404. <el-table-column prop="title" label="合同名称" width="" />
  405. <el-table-column prop="client" label="甲方/客户" width="" />
  406. <el-table-column prop="developer" label="乙方/开发公司" width="" />
  407. <el-table-column prop="date" label="合同签署日期" width="">
  408. <template #default="{ row }">
  409. <el-text v-if="row.date">{{ row.date }}</el-text>
  410. <el-text v-else>暂无数据</el-text>
  411. </template>
  412. </el-table-column>
  413. <el-table-column prop="start_date" label="合同开始日期" width="">
  414. <template #default="{ row }">
  415. <el-text v-if="row.start_date">{{ row.start_date }}</el-text>
  416. <el-text v-else>暂无数据</el-text>
  417. </template>
  418. </el-table-column>
  419. <el-table-column prop="end_date" label="合同结束日期" width="">
  420. <template #default="{ row }">
  421. <el-text v-if="row.end_date">{{ row.end_date }}</el-text>
  422. <el-text v-else>暂无数据</el-text>
  423. </template>
  424. </el-table-column>
  425. <el-table-column prop="amount" label="合同金额/元" width="">
  426. <template #default="{ row }">
  427. <money :money="row.amount" />
  428. </template>
  429. </el-table-column>
  430. <el-table-column prop="attachment" label="附件" width="">
  431. <template #default="scope">
  432. <el-link v-if="scope.row.attachment" :href="scope.row.attachment" target="_blank"
  433. type="primary">查看附件</el-link>
  434. <el-link v-else target="_blank" type="info" disabled>暂无附件</el-link>
  435. </template>
  436. </el-table-column>
  437. <el-table-column fixed="right" label="操作" width="">
  438. <template #default="scope">
  439. <el-button link type="primary" @click="editContract(scope.row)">更新</el-button>
  440. <el-button link type="danger" @click="deleteContract(scope.row)">删除</el-button>
  441. </template>
  442. </el-table-column>
  443. </el-table>
  444. </el-form>
  445. </template>
  446. <template #footer>
  447. <el-button type="primary" @click="newContract(data.formContract)">添加新合同</el-button>
  448. <el-button type="default" @click="closePage">取消</el-button>
  449. </template>
  450. </vuecmf-dialog>
  451. <!-- 弹出合同新增页面-->
  452. <vuecmf-dialog width="500px" :model_value="data.contract.show" :title="data.contract.title"
  453. @close="closeSchedulePage">
  454. <template #content>
  455. <el-form :model="data.formContract" label-width="120px" ref="formRef" v-loading="data.contract.isLoading">
  456. <el-form-item label="合同名称" prop="title"
  457. :rules="[{ required: true, message: '请填写合同名称', trigger: 'blur' }]">
  458. <el-input v-model="data.formContract.title" placeholder="合同名称" />
  459. </el-form-item>
  460. <el-form-item label="甲方/客户" prop="client"
  461. :rules="[{ required: true, message: '请填写甲方/客户', trigger: 'blur' }]">
  462. <el-input v-model="data.formContract.client" placeholder="甲方/客户" />
  463. </el-form-item>
  464. <el-form-item label="乙方/开发公司" prop="developer"
  465. :rules="[{ required: true, message: '请填写乙方/开发公司', trigger: 'blur' }]">
  466. <el-input v-model="data.formContract.developer" placeholder="乙方/开发公司" />
  467. </el-form-item>
  468. <el-form-item label="合同金额" prop="amount"
  469. :rules="[{ required: true, message: '请填写合同金额', trigger: 'blur' }]">
  470. <el-input type="number" v-model="data.formContract.amount" placeholder="合同金额">
  471. <template #append>元</template>
  472. </el-input>
  473. </el-form-item>
  474. <el-form-item label="合同签署日期" prop="date">
  475. <el-date-picker v-model="data.formContract.date" type="date" placeholder="合同签署日期"
  476. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  477. </el-form-item>
  478. <el-form-item label="合同开始日期" prop="start_date">
  479. <el-date-picker v-model="data.formContract.start_date" type="start_date" placeholder="合同开始日期"
  480. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  481. </el-form-item>
  482. <el-form-item label="合同结束日期" prop="end_date">
  483. <el-date-picker v-model="data.formContract.end_date" type="end_date" placeholder="合同结束日期"
  484. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  485. </el-form-item>
  486. <el-form-item label="附件" prop="attachment">
  487. <el-button type="default" @click="importExcel()">上传附件</el-button>
  488. <el-text class="ml10">{{ data.attachMenttitle }}</el-text>
  489. </el-form-item>
  490. </el-form>
  491. <div class="height20"></div>
  492. </template>
  493. <template #footer>
  494. <el-button type="default" @click="closeSchedulePage">取消</el-button>
  495. <el-button type="success" @click="submitContract(formRef)">提交</el-button>
  496. </template>
  497. </vuecmf-dialog>
  498. <!-- 弹出合同更新页面-->
  499. <vuecmf-dialog width="500px" :model_value="data.contractup.show" :title="data.contractup.title"
  500. @close="closeSchedulePage">
  501. <template #content>
  502. <el-form :model="data.formContract" label-width="120px" ref="formRef" v-loading="data.contractup.isLoading">
  503. <el-form-item label="合同名称" prop="title"
  504. :rules="[{ required: true, message: '请填写合同名称', trigger: 'blur' }]">
  505. <el-input v-model="data.formContract.title" placeholder="合同名称" />
  506. </el-form-item>
  507. <el-form-item label="甲方/客户" prop="client"
  508. :rules="[{ required: true, message: '请填写甲方/客户', trigger: 'blur' }]">
  509. <el-input v-model="data.formContract.client" placeholder="甲方/客户" />
  510. </el-form-item>
  511. <el-form-item label="乙方/开发公司" prop="developer"
  512. :rules="[{ required: true, message: '请填写乙方/开发公司', trigger: 'blur' }]">
  513. <el-input v-model="data.formContract.developer" placeholder="乙方/开发公司" />
  514. </el-form-item>
  515. <el-form-item label="合同金额" prop="amount"
  516. :rules="[{ required: true, message: '请填写合同金额', trigger: 'blur' }]">
  517. <el-input v-model="data.formContract.amount" placeholder="合同金额" />
  518. </el-form-item>
  519. <el-form-item label="合同签署日期" prop="date">
  520. <el-date-picker v-model="data.formContract.date" type="date" placeholder="合同签署日期"
  521. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  522. </el-form-item>
  523. <el-form-item label="合同开始日期" prop="start_date">
  524. <el-date-picker v-model="data.formContract.start_date" type="start_date" placeholder="合同开始日期"
  525. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  526. </el-form-item>
  527. <el-form-item label="合同结束日期" prop="end_date">
  528. <el-date-picker v-model="data.formContract.end_date" type="end_date" placeholder="合同结束日期"
  529. value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
  530. </el-form-item>
  531. <el-form-item label="附件" prop="attachment">
  532. <el-button type="default" @click="importExcel()">上传附件</el-button>
  533. <el-text class="ml10">{{ data.attachMenttitle }}</el-text>
  534. </el-form-item>
  535. </el-form>
  536. <div class="height20"></div>
  537. </template>
  538. <template #footer>
  539. <el-button type="default" @click="closeSchedulePage">取消</el-button>
  540. <el-button type="primary" @click="submitContractUpdate()">更新</el-button>
  541. </template>
  542. </vuecmf-dialog>
  543. <!-- 弹出状态新增的页面-->
  544. <vuecmf-dialog width="500px" :model_value="data.statusDialog.show" :title="data.statusDialog.title"
  545. @close="closePage">
  546. <template #content>
  547. <el-form :model="data.formStatus" label-width="150px" ref="formRef" v-loading="data.statusDialog.isLoading">
  548. <el-form-item label="状态值(英文)" prop="key">
  549. <el-input v-model="data.formStatus.key" placeholder="状态值" />
  550. </el-form-item>
  551. <el-form-item label="状态名(显示名)" prop="value">
  552. <el-input v-model="data.formStatus.value" placeholder="填写状态名" />
  553. </el-form-item>
  554. </el-form>
  555. <div class="height20"></div>
  556. </template>
  557. <template #footer>
  558. <el-button type="default" @click="closePage">取消</el-button>
  559. <el-button type="primary" @click="submitStatusForm">提交</el-button>
  560. </template>
  561. </vuecmf-dialog>
  562. <!-- 弹出状态更新的页面-->
  563. <vuecmf-dialog width="500px" :model_value="data.statusLog.show" :title="data.statusLog.title" @close="closePage">
  564. <template #content>
  565. <el-form :model="data.formStatus" label-width="120px" ref="formRef" v-loading="data.statusLog.isLoading">
  566. <el-form-item label="修改前状态名:" prop="value">
  567. <el-select v-model="data.formStatus.key" placeholder="选择状态">
  568. <el-option :label="item[1]" :value="item[0]" v-for="item in statusList.data" />
  569. </el-select>
  570. </el-form-item>
  571. <el-form-item label="状态值:" prop="key">
  572. <el-input v-model="data.formStatus.key" disabled :style="{ width: '215px' }" />
  573. </el-form-item>
  574. <el-form-item label="修改后状态名:" prop="value">
  575. <el-input v-model="data.formStatus.value" placeholder="新状态名" :style="{ width: '215px' }" />
  576. </el-form-item>
  577. </el-form>
  578. <div class="height20"></div>
  579. </template>
  580. <template #footer>
  581. <el-button type="default" @click="closePage">取消</el-button>
  582. <el-button type="primary" @click="editStatusForm">更新</el-button>
  583. </template>
  584. </vuecmf-dialog>
  585. <!-- 上传附件 -->
  586. <ImportExcelDialog ref="importExcelDialogRef" @refresh="getAttachment" />
  587. </div>
  588. </template>
  589. <script lang="ts" setup>
  590. import { onMounted, reactive, computed, ref, defineAsyncComponent, nextTick } from 'vue';
  591. import { storeToRefs } from 'pinia';
  592. import { useThemeConfig } from '/@/stores/themeConfig';
  593. import Repertory from '/@/api/model/Repertory'; //gzs:引入模型
  594. import statusList from '/@/views/data/status';
  595. import { ElMessage, ElMessageBox, genFileId } from 'element-plus';
  596. import type { FormInstance } from 'element-plus';
  597. import { money, getMoneyCent } from '/@/utils/moneyHelper';
  598. import { clone } from 'lodash'
  599. import { clone } from 'lodash'
  600. // 定义变量内容
  601. const storesThemeConfig = useThemeConfig();
  602. const { themeConfig } = storeToRefs(storesThemeConfig);
  603. // 获取布局配置信息
  604. const getThemeConfig = computed(() => {
  605. return themeConfig.value;
  606. });
  607. const formRef = ref<FormInstance>();
  608. const multipleSelection = ref([]);
  609. let data = reactive({
  610. //请求项目查询的参数
  611. params: {
  612. pageSize: getThemeConfig.value.pageSize, //分页大小
  613. page: 1, //当前页面
  614. keyword: '', //关键字
  615. status: [], //状态
  616. responsibility_person_id: '',//负责人id
  617. create_time_begin_time: '',//开始创建时间
  618. create_time_end_time: '',//结束创建时间
  619. min_amount: '',//最小金额
  620. max_amount: '',//最大金额
  621. min_dev_time_days: '',//最小开发时间/天
  622. max_dev_time_days: '',//最大开发时间/天
  623. min_maintain_time_days: '',//最小维护时间/天
  624. max_maintain_time_days: '',//最大维护时间/天
  625. },
  626. //请求合同查询的参数
  627. contractParams: {
  628. pageSize: getThemeConfig.value.pageSize, //分页大小
  629. page: 1, //当前页面
  630. project_id: '', //项目id
  631. },
  632. //分页组件的变量
  633. pagination: {
  634. currentPage: 1,
  635. pageSize: getThemeConfig.value.pageSize,
  636. total: 100,
  637. },
  638. //项目新增和编辑弹出框
  639. dialog: {
  640. show: false, // 是否显示弹出框,用于最大化、最小化及还原
  641. title: '添加', // 弹出框标题
  642. isLoading: false, //是否加载中
  643. },
  644. //项目详情弹出框
  645. dialogDetail: {
  646. showDetail: false, // 是否显示弹出框,用于最大化、最小化及还原
  647. titleDetail: '添加', // 弹出框标题
  648. isLoadingDetail: false, //是否加载中
  649. },
  650. //新增进度弹出框
  651. schedule: {
  652. show: false, // 是否显示弹出框,用于最大化、最小化及还原
  653. title: '添加', // 弹出框标题
  654. isLoading: false, //是否加载中
  655. },
  656. //编辑进度弹出框
  657. scheduleup: {
  658. show: false, // 是否显示弹出框,用于最大化、最小化及还原
  659. title: '编辑', // 弹出框标题
  660. isLoading: false, //是否加载中
  661. },
  662. //合同详情弹出框
  663. contractDetail: {
  664. showDetail: false, // 是否显示弹出框,用于最大化、最小化及还原
  665. titleDetail: '添加', // 弹出框标题
  666. isLoadingDetail: false, //是否加载中
  667. },
  668. //新增合同弹出框
  669. contract: {
  670. show: false, // 是否显示弹出框,用于最大化、最小化及还原
  671. title: '添加', // 弹出框标题
  672. isLoading: false, //是否加载中
  673. },
  674. //编辑合同弹出框
  675. contractup: {
  676. show: false, // 是否显示弹出框,用于最大化、最小化及还原
  677. title: '编辑', // 弹出框标题
  678. isLoading: false, //是否加载中
  679. },
  680. //项目新增弹出框
  681. statusDialog: {
  682. show: false, // 是否显示弹出框,用于最大化、最小化及还原
  683. title: '添加', // 弹出框标题
  684. isLoading: false, //是否加载中
  685. },
  686. //项目编辑弹出框
  687. statusLog: {
  688. show: false, // 是否显示弹出框,用于最大化、最小化及还原
  689. title: '添加', // 弹出框标题
  690. isLoading: false, //是否加载中
  691. },
  692. //新建进度的状态
  693. stalist: [
  694. {
  695. value: '未开始',
  696. key: 'NOT_START',
  697. },
  698. {
  699. value: '进行中 ',
  700. key: 'GOING',
  701. },
  702. {
  703. value: '完成',
  704. key: 'FINISH',
  705. },
  706. {
  707. value: '跳过',
  708. key: 'SKIP',
  709. },
  710. ] as any,
  711. loading: false, //是否加载中
  712. tableData: [], // 表格数据
  713. tableContract: [] as any, //合同数据
  714. attachMenttitle: '', //附件名
  715. form: {} as any, //新增和修改项目数据
  716. formList: {} as any, //新增和修改进度数据
  717. formContract: {} as any, //新增和修改合同数据
  718. formStatus: {} as any, //新增和修改状态数据
  719. repertoryList: [] as any,//参与人员列表
  720. });
  721. /**
  722. * 上传
  723. */
  724. const ImportExcelDialog = defineAsyncComponent(() => import("/@/views/payrollModule/import.vue"));
  725. const importExcelDialogRef = ref();
  726. const importExcel = () => {
  727. importExcelDialogRef.value.openDialog();
  728. };
  729. //接收
  730. const getAttachment = async (item: string) => {
  731. console.log("🚀 ~ file: repertory.vue:378 ~ getattachment ~ item:", item)
  732. nextTick(() => {
  733. data.formContract.attachment = item[0];
  734. data.attachMenttitle = item[1];
  735. })
  736. };
  737. /**
  738. * 实例化1个合同表单对象
  739. */
  740. const newFormcontract = () => {
  741. let formcontract = {
  742. client: '',
  743. developer: '',
  744. title: '',
  745. amount: '',
  746. attachment: '',
  747. project_id: '',
  748. date: null,
  749. start_date: null,
  750. end_date: null,
  751. };
  752. return formcontract;
  753. };
  754. /**
  755. * 实例化1个项目表单对象
  756. */
  757. const newForm = () => {
  758. let form = {
  759. desc: '',
  760. responsibility_person_id: '',
  761. name: '',
  762. source: '',
  763. participants_id: [],
  764. estimated_amount: '',
  765. status: '',
  766. pre_dev_time: '',
  767. pre_maintain_time: '',
  768. project_start_date: null,
  769. project_end_date: null,
  770. dev_start_date: null,
  771. dev_end_date: null,
  772. maintain_start_date: null,
  773. maintain_end_date: null,
  774. };
  775. return form;
  776. };
  777. /**
  778. * 实例化1个进度表单对象
  779. */
  780. const newFormlist = () => {
  781. let formlist = {
  782. project_id: '',
  783. name: '',
  784. desc: '',
  785. updater_id: '',
  786. start_date: null,
  787. end_date: null,
  788. is_update_project_status: 1,
  789. status: '',
  790. finish_project_status: '',
  791. going_project_status: '',
  792. };
  793. return formlist;
  794. };
  795. /**
  796. * 实例化1个状态表单对象
  797. */
  798. const newFormstatuslist = () => {
  799. let formstatus = {
  800. key: '',
  801. value: '',
  802. };
  803. return formstatus;
  804. };
  805. /**
  806. * 切换页面大小
  807. * @param val
  808. */
  809. const handleSizeChange = (val: number) => {
  810. data.params.pageSize = val;
  811. getList();
  812. getContractList();
  813. };
  814. /**
  815. * 翻页
  816. */
  817. const handleCurrentChange = (val: number) => {
  818. data.params.page = val;
  819. getList();
  820. getContractList();
  821. };
  822. const search = async () => {
  823. data.params.page = 1;
  824. await getList();
  825. await getContractList();
  826. };
  827. /**
  828. * 页面初始化方法,有就写逻辑,没有可以留空
  829. */
  830. const init = async () => {
  831. await Repertory.statuslist({});
  832. let Repertoryres = await Repertory.all({});
  833. if (Repertoryres.code != 0) {
  834. return;
  835. }
  836. data.repertoryList = Repertoryres.data;
  837. };
  838. /**
  839. * 获取分页数据
  840. */
  841. const getList = async () => {
  842. data.loading = true;
  843. const res = await Repertory.list({
  844. pageParams: {
  845. size: data.params.pageSize,
  846. page: data.params.page
  847. },
  848. keyword: data.params.keyword,
  849. status: data.params.status,
  850. responsibility_person_id: data.params.responsibility_person_id,
  851. create_time_begin_time: data.params.create_time_begin_time,
  852. create_time_end_time: data.params.create_time_end_time,
  853. min_amount: data.params.min_amount,
  854. max_amount: data.params.max_amount,
  855. min_dev_time_days: data.params.min_dev_time_days,
  856. max_dev_time_days: data.params.max_dev_time_days,
  857. min_maintain_time_days: data.params.min_maintain_time_days,
  858. max_maintain_time_days: data.params.max_maintain_time_days,
  859. });
  860. data.loading = false;
  861. if (res.code != 0) {
  862. return;
  863. }
  864. data.tableData = res.data.data;
  865. data.tableData.forEach((item: any) => {
  866. item.participants_id.forEach(i => i = Number(i))
  867. });
  868. console.log("🚀 ~ file: repertory.vue:835 ~ data.tableData.forEach ~ data.tableData:", data.tableData)
  869. //分页数据赋值
  870. data.pagination.total = res.data.total;
  871. data.pagination.currentPage = res.data.current_page;
  872. data.pagination.pageSize = res.data.per_page;
  873. };
  874. /**
  875. * 获取合同分页数据
  876. */
  877. const getContractList = async () => {
  878. data.loading = true;
  879. const res = await Repertory.listcontract({
  880. pageParams: {
  881. size: data.contractParams.pageSize,
  882. page: data.contractParams.page
  883. },
  884. project_id: data.contractParams.project_id,
  885. });
  886. data.loading = false;
  887. if (res.code != 0) {
  888. return;
  889. }
  890. data.tableContract = res.data.data
  891. };
  892. // 翻页
  893. const handleTableDataSelectionChange = (val: any) => {
  894. multipleSelection.value = val;
  895. };
  896. //=========添加 和 编辑 删除
  897. /**
  898. * 关闭弹出框
  899. */
  900. const closePage = () => {
  901. data.dialog.show = false;
  902. data.statusDialog.show = false;
  903. data.statusLog.show = false;
  904. data.dialogDetail.showDetail = false;
  905. data.contractDetail.showDetail = false;
  906. };
  907. const closeSchedulePage = () => {
  908. data.schedule.show = false;
  909. data.scheduleup.show = false;
  910. data.contract.show = false;
  911. data.contractup.show = false;
  912. };
  913. /**
  914. * 弹出新增状态页面
  915. */
  916. const addstatus = () => {
  917. data.statusDialog.show = true;
  918. data.statusDialog.title = '添加状态';
  919. data.formStatus = newFormstatuslist();
  920. };
  921. /**
  922. * 弹出更新状态页面
  923. */
  924. const editstatus = () => {
  925. data.statusLog.show = true;
  926. data.statusLog.title = '更新状态';
  927. data.formStatus = newFormstatuslist();
  928. };
  929. /**
  930. * 弹出新增项目页面
  931. */
  932. const addPage = () => {
  933. data.dialog.show = true;
  934. data.dialog.title = '添加项目'; //gzs:标题
  935. data.form = newForm();
  936. };
  937. /**
  938. * 弹出编辑项目页面
  939. */
  940. const edit = (item: any) => {
  941. data.form = item;
  942. data.dialog.title = '编辑项目';
  943. data.dialog.show = true;
  944. };
  945. /**
  946. * 获取项目详情
  947. */
  948. const openDetail = (item: any) => {
  949. data.formList.project_id = item.id;
  950. data.form = item;
  951. data.dialogDetail.titleDetail = '项目详情';
  952. data.dialogDetail.showDetail = true;
  953. };
  954. /**
  955. * 弹出新增项目进度页面
  956. */
  957. const newSchedule = async (item: any) => {
  958. console.log("🚀 ~ file: repertory.vue:810 ~ newSchedule ~ item:", item)
  959. data.schedule.show = true;
  960. data.schedule.title = '添加进度';
  961. data.formList = newFormlist();
  962. data.formList.project_id = item.id;
  963. };
  964. /**
  965. * 弹出编辑项目进度页面
  966. */
  967. const editSchedule = async (item: any) => {
  968. console.log("🚀 ~ file: repertory.vue:820 ~ editSchedule ~ item:", item)
  969. data.formList = item;
  970. data.scheduleup.show = true;
  971. data.scheduleup.title = '编辑项目进度';
  972. };
  973. /**
  974. * 获取合同详情
  975. */
  976. const openContract = async (item: any) => {
  977. data.formContract.project_id = item.id;
  978. data.contractParams.project_id = item.id;
  979. data.contractDetail.showDetail = true;
  980. data.contractDetail.titleDetail = '合同详情';
  981. await getContractList();
  982. };
  983. /**
  984. * 弹出新增合同页面
  985. */
  986. const newContract = async (item: any) => {
  987. data.contract.show = true;
  988. data.contract.title = '添加合同';
  989. data.attachMenttitle = '';
  990. console.log("🚀 ~ file: repertory.vue:955 ~ newContract ~ item:", item)
  991. data.formContract = newFormcontract();
  992. data.formContract.project_id = item.project_id;
  993. };
  994. /**
  995. * 弹出编辑项目进度页面
  996. */
  997. const editContract = async (item: any) => {
  998. data.contractup.show = true;
  999. data.contractup.title = '编辑合同';
  1000. data.formContract = item;
  1001. };
  1002. /**
  1003. * 提交项目表单,新增和修改
  1004. */
  1005. const submitForm = (formEl: FormInstance | undefined) => {
  1006. if (!formEl) return;
  1007. formEl.validate(async (valid) => {
  1008. if (!valid) {
  1009. console.log('error submit!');
  1010. return false;
  1011. }
  1012. let res;
  1013. data.dialog.isLoading = true;
  1014. if (data.form?.id) {
  1015. //如果是编辑
  1016. res = await Repertory.edit(data.form);
  1017. } else {
  1018. res = await Repertory.add(data.form);
  1019. }
  1020. data.dialog.isLoading = false;
  1021. if (res.code != 0) {
  1022. return;
  1023. }
  1024. ElMessage.success(res.msg);
  1025. search();
  1026. closePage();
  1027. });
  1028. };
  1029. /**
  1030. * 提交进度表单,新增
  1031. */
  1032. const submitSchedule = async (formEl: FormInstance | undefined) => {
  1033. if (!formEl) return;
  1034. formEl.validate(async (valid) => {
  1035. if (!valid) {
  1036. console.log('error submit!');
  1037. return false;
  1038. }
  1039. data.schedule.isLoading = true;
  1040. let res = await Repertory.addschedules(data.formList);
  1041. data.schedule.isLoading = false;
  1042. if (res.code != 0) {
  1043. return;
  1044. }
  1045. ElMessage.success(res.msg);
  1046. search();
  1047. closeSchedulePage();
  1048. closePage();
  1049. });
  1050. };
  1051. /**
  1052. * 提交进度表单,编辑
  1053. */
  1054. const submitScheduleUpdate = async () => {
  1055. data.schedule.isLoading = true;
  1056. let res = await Repertory.editschedules(data.formList);
  1057. data.schedule.isLoading = false;
  1058. if (res.code != 0) {
  1059. return;
  1060. }
  1061. ElMessage.success(res.msg);
  1062. search();
  1063. closeSchedulePage();
  1064. closePage();
  1065. };
  1066. /**
  1067. * 提交合同表单,新增
  1068. */
  1069. const submitContract = async (formEl: FormInstance | undefined) => {
  1070. if (!formEl) return;
  1071. formEl.validate(async (valid) => {
  1072. if (!valid) {
  1073. console.log('error submit!');
  1074. return false;
  1075. }
  1076. // 修改为分
  1077. const contract = clone(data.formContract)
  1078. contract.amount = getMoneyCent(data.formContract.amount)
  1079. data.contract.isLoading = true;
  1080. let res = await Repertory.addcontract(contract);
  1081. data.contract.isLoading = false;
  1082. if (res.code != 0) {
  1083. return;
  1084. }
  1085. ElMessage.success(res.msg);
  1086. search();
  1087. closeSchedulePage();
  1088. closePage();
  1089. });
  1090. };
  1091. /**
  1092. * 提交合同表单,编辑
  1093. */
  1094. const submitContractUpdate = async () => {
  1095. // 修改为分
  1096. const contract = clone(data.formContract)
  1097. contract.amount = getMoneyCent(data.formContract.amount)
  1098. data.contract.isLoading = true;
  1099. let res = await Repertory.editcontract(contract);
  1100. data.contract.isLoading = false;
  1101. if (res.code != 0) {
  1102. return;
  1103. }
  1104. ElMessage.success(res.msg);
  1105. search();
  1106. closeSchedulePage();
  1107. closePage();
  1108. };
  1109. /**
  1110. * 提交状态表单,新增
  1111. */
  1112. const submitStatusForm = async () => {
  1113. data.statusDialog.isLoading = true;
  1114. let res = await Repertory.addstatus(data.formStatus);
  1115. data.statusDialog.isLoading = false;
  1116. if (res.code != 0) {
  1117. return;
  1118. }
  1119. ElMessage.success(res.msg);
  1120. search();
  1121. init();
  1122. closePage();
  1123. getList();
  1124. };
  1125. /**
  1126. * 提交状态表单,更新
  1127. */
  1128. const editStatusForm = async () => {
  1129. data.statusLog.isLoading = true;
  1130. let res = await Repertory.editstatus(data.formStatus);
  1131. data.statusLog.isLoading = false;
  1132. if (res.code != 0) {
  1133. return;
  1134. }
  1135. ElMessage.success(res.msg);
  1136. search();
  1137. closePage();
  1138. getList();
  1139. init();
  1140. };
  1141. //删除项目数据
  1142. const deleteOne = (item: any) => {
  1143. ElMessageBox.confirm('删除后不可恢复,确定要删除该记录吗?', '警告', {
  1144. confirmButtonText: '确定',
  1145. cancelButtonText: '取消',
  1146. type: 'warning',
  1147. })
  1148. .then(() => {
  1149. doDelete([item.id]);
  1150. })
  1151. .catch(() => { });
  1152. };
  1153. //删除进度数据
  1154. const deleteSchedule = (item: any) => {
  1155. ElMessageBox.confirm('删除后不可恢复,确定要删除该记录吗?', '警告', {
  1156. confirmButtonText: '确定',
  1157. cancelButtonText: '取消',
  1158. type: 'warning',
  1159. })
  1160. .then(() => {
  1161. scheduleDelete([item.id]);
  1162. })
  1163. .catch(() => { });
  1164. };
  1165. //删除合同数据
  1166. const deleteContract = (item: any) => {
  1167. ElMessageBox.confirm('删除后不可恢复,确定要删除该记录吗?', '警告', {
  1168. confirmButtonText: '确定',
  1169. cancelButtonText: '取消',
  1170. type: 'warning',
  1171. })
  1172. .then(() => {
  1173. doDeleteContract([item.id]);
  1174. })
  1175. .catch(() => { });
  1176. };
  1177. //执行删除项目请求
  1178. const doDelete = async (ids: any) => {
  1179. data.loading = true;
  1180. let res = await Repertory.delete(ids);
  1181. data.loading = false;
  1182. if (res.code != 0) {
  1183. return;
  1184. }
  1185. await getList();
  1186. };
  1187. //执行删除进度请求
  1188. const scheduleDelete = async (ids: any) => {
  1189. data.loading = true;
  1190. let res = await Repertory.deleteschedules(ids);
  1191. data.loading = false;
  1192. if (res.code != 0) {
  1193. return;
  1194. }
  1195. search();
  1196. closeSchedulePage();
  1197. closePage();
  1198. };
  1199. //执行删除合同请求
  1200. const doDeleteContract = async (ids: any) => {
  1201. data.loading = true;
  1202. let res = await Repertory.deletecontract(ids);
  1203. data.loading = false;
  1204. if (res.code != 0) {
  1205. return;
  1206. }
  1207. search();
  1208. closeSchedulePage();
  1209. closePage();
  1210. };
  1211. //=========页面事件
  1212. /**
  1213. * 页面加载时事件
  1214. */
  1215. onMounted(async () => {
  1216. getList();
  1217. init();
  1218. });
  1219. </script>
  1220. <style scoped lang="scss">.text {
  1221. text-align: right;
  1222. }</style>