rent_computer.vue 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383
  1. <!--
  2. * @Author: 倚楼听风雨 18408246387@163.com
  3. * @Date: 2022-11-16 17:16:17
  4. * @LastEditors: 倚楼听风雨 18408246387@163.com
  5. * @LastEditTime: 2023-03-14 16:32:48
  6. * @FilePath: \log-server-web\src\view\logComputer\list_computer_distinct.vue
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. -->
  9. <template>
  10. <div>
  11. <div class="gva-search-box">
  12. <div class="gva-btn-list">
  13. <el-form ref="searchForm" :inline="true" :model="searchInfo">
  14. <el-form-item label="电脑编号">
  15. <el-input
  16. v-model="searchInfo.pc_num"
  17. placeholder="编号"
  18. size="small"
  19. />
  20. </el-form-item>
  21. <el-form-item label="供应商">
  22. <el-select v-model="searchInfo.shop_id" size="small">
  23. <el-option
  24. v-for="item in shopOptions"
  25. :key="item.value"
  26. :label="item.label"
  27. :value="item.value"
  28. />
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item label="套餐">
  32. <el-select v-model="searchInfo.set_meal_id" size="small"
  33. ><el-option
  34. v-for="item in setMealOptions"
  35. :key="item.value"
  36. :label="item.label"
  37. :value="item.value"
  38. /></el-select>
  39. </el-form-item>
  40. <el-form-item label="是否到期">
  41. <el-select v-model="searchInfo.is_expire" size="small">
  42. <el-option label="否" value="0" />
  43. <el-option label="是" value="1" />
  44. <el-option label="明日到期" value="2" />
  45. </el-select>
  46. </el-form-item>
  47. <el-form-item label="使用人">
  48. <el-select v-model="searchInfo.director_name" size="small">
  49. <el-option
  50. v-for="item in directorOptions"
  51. :key="item.value"
  52. :label="item.label"
  53. :value="item.value"
  54. />
  55. </el-select>
  56. </el-form-item>
  57. <el-form-item label="是否下架">
  58. <el-select v-model="searchInfo.is_off_shelf" size="small">
  59. <el-option label="否" value="0" />
  60. <el-option label="是" value="1" />
  61. </el-select>
  62. </el-form-item>
  63. <el-form-item>
  64. <el-button
  65. size="small"
  66. type="primary"
  67. icon="search"
  68. @click="onSubmit"
  69. >查询</el-button
  70. >
  71. <el-button size="small" icon="refresh" @click="onReset"
  72. >重置</el-button
  73. >
  74. </el-form-item>
  75. </el-form>
  76. </div>
  77. <div class="gva-btn-list">
  78. <el-button size="small" type="primary" icon="plus" @click="addMenu('0')"
  79. >新增</el-button
  80. >
  81. <el-button
  82. class="excel-btn"
  83. size="small"
  84. type="success"
  85. icon="download"
  86. @click="downloadExcelTemplate()"
  87. >下载模板</el-button
  88. >
  89. <el-upload
  90. style="margin-left: 1%"
  91. class="excel-btn"
  92. :action="`${path}/rentComputer/importExcel`"
  93. :headers="{ 'x-token': userStore.token }"
  94. :on-success="loadExcel"
  95. :show-file-list="false"
  96. >
  97. <el-button size="small" type="primary" icon="upload">导入</el-button>
  98. </el-upload>
  99. <el-button
  100. icon="delete"
  101. size="small"
  102. type="danger"
  103. :disabled="!apis.length"
  104. style="margin-left: 10px"
  105. @click="deletesMenu()"
  106. >删除</el-button
  107. >
  108. <!-- <el-popover v-model="deleteVisible" placement="top" width="160">
  109. <p>确定要删除吗?</p>
  110. <div style="text-align: right; margin-top: 8px;">
  111. <el-button size="small" type="primary" link @click="deleteVisible = false">取消</el-button>
  112. <el-button size="small" type="primary" @click="onDelete">确定</el-button>
  113. </div>
  114. <template #reference>
  115. <el-button icon="delete" size="small" :disabled="!apis.length" style="margin-left: 10px;" @click="deleteVisible = true">删除</el-button>
  116. </template>
  117. </el-popover> -->
  118. </div>
  119. </div>
  120. <div class="row center">
  121. <el-tag size="large">电脑数量 : {{ computerNum }} </el-tag>
  122. </div>
  123. <div class="gva-table-box">
  124. <!-- <el-scrollbar height="550px"> -->
  125. <el-table
  126. height="500px"
  127. :data="tableData"
  128. @sort-change="sortChange"
  129. @selection-change="handleSelectionChange"
  130. border
  131. v-loading="loading"
  132. >
  133. <el-table-column type="selection" width="55" />
  134. <el-table-column
  135. align="left"
  136. label="供应商"
  137. min-width="70"
  138. prop="shop_name"
  139. />
  140. <!-- <el-table-column
  141. align="left"
  142. label="套餐"
  143. min-width="100"
  144. prop="set_meal_name"
  145. /> -->
  146. <el-table-column
  147. align="center"
  148. label="套餐"
  149. min-width="150"
  150. prop="set_meal_name"
  151. >
  152. <template #default="scope">
  153. <span v-if="scope.row.price_type == 0">{{
  154. scope.row.set_meal_name + "-天卡(" + scope.row.rent_price + "元)"
  155. }}</span>
  156. <span v-else-if="scope.row.price_type == 1">{{
  157. scope.row.set_meal_name + "-周卡(" + scope.row.rent_price + "元)"
  158. }}</span>
  159. <span v-else>{{
  160. scope.row.set_meal_name + "-月卡(" + scope.row.rent_price + "元)"
  161. }}</span>
  162. </template>
  163. </el-table-column>
  164. <el-table-column
  165. align="left"
  166. label="编号"
  167. min-width="80"
  168. prop="pc_num"
  169. />
  170. <el-table-column
  171. align="left"
  172. label="名称"
  173. min-width="80"
  174. prop="pc_name"
  175. />
  176. <el-table-column
  177. align="left"
  178. label="起租时间"
  179. min-width="150"
  180. prop="rent_start"
  181. />
  182. <el-table-column
  183. align="left"
  184. label="到期时间"
  185. min-width="150"
  186. prop="rent_end"
  187. />
  188. <el-table-column
  189. align="left"
  190. label="租期"
  191. min-width="50"
  192. prop="rent_duration"
  193. />
  194. <el-table-column
  195. align="left"
  196. label="使用人"
  197. min-width="80"
  198. prop="director_name"
  199. />
  200. <el-table-column
  201. align="center"
  202. label="是否到期"
  203. min-width="100"
  204. prop="is_expire"
  205. >
  206. <template #default="scope">
  207. <el-button
  208. v-if="scope.row.is_expire == 2"
  209. size="small"
  210. type="warning"
  211. plain
  212. >即将到期</el-button
  213. >
  214. <el-button
  215. v-if="scope.row.is_expire == 1"
  216. size="small"
  217. type="info"
  218. plain
  219. >到期未续</el-button
  220. >
  221. <el-button
  222. v-if="scope.row.is_expire == 0"
  223. size="small"
  224. type="success"
  225. plain
  226. >在租期中</el-button
  227. >
  228. </template>
  229. </el-table-column>
  230. <el-table-column
  231. align="center"
  232. label="是否下架"
  233. min-width="100"
  234. prop="is_off_shelf"
  235. >
  236. <template #default="scope">
  237. <el-button
  238. v-if="scope.row.is_off_shelf == 1"
  239. size="small"
  240. type="warning"
  241. plain
  242. >是</el-button
  243. >
  244. <el-button v-else size="small" type="success" plain>否</el-button>
  245. </template>
  246. </el-table-column>
  247. <el-table-column
  248. align="left"
  249. label="TD号"
  250. min-width="100"
  251. prop="todesk_id"
  252. />
  253. <el-table-column
  254. align="left"
  255. label="TD密码"
  256. min-width="100"
  257. prop="todesk_password"
  258. />
  259. <el-table-column
  260. align="left"
  261. label="向日葵号"
  262. min-width="100"
  263. prop="sunflower_id"
  264. />
  265. <el-table-column
  266. align="left"
  267. label="向日葵密码"
  268. min-width="100"
  269. prop="sunflower_password"
  270. />
  271. <el-table-column
  272. align="left"
  273. label="备注"
  274. min-width="250"
  275. prop="remark"
  276. show-overflow-tooltip
  277. />
  278. <el-table-column
  279. align="left"
  280. label="更新时间"
  281. min-width="150"
  282. prop="update_time"
  283. />
  284. <el-table-column align="left" fixed="right" label="操作" width="430">
  285. <template #default="scope">
  286. <el-button
  287. size="small"
  288. type="primary"
  289. link
  290. icon="link"
  291. @click="linkTd(scope.row)"
  292. >TD连接</el-button
  293. >
  294. <el-button
  295. size="small"
  296. type="primary"
  297. link
  298. icon="edit"
  299. @click="switchRenew(scope.row)"
  300. >续费</el-button
  301. >
  302. <el-button
  303. v-if="scope.row.is_expire != 1"
  304. size="small"
  305. type="primary"
  306. link
  307. icon="edit"
  308. @click="switchRentingOut(scope.row)"
  309. >退租</el-button
  310. >
  311. <el-button
  312. v-if="scope.row.is_expire != 1"
  313. size="small"
  314. type="primary"
  315. link
  316. icon="edit"
  317. @click="switchReplaceNum(scope.row)"
  318. >换编号</el-button
  319. >
  320. <el-button
  321. v-if="scope.row.is_off_shelf == 0"
  322. size="small"
  323. type="primary"
  324. link
  325. icon="edit"
  326. @click="offShelf(scope.row)"
  327. >下架</el-button
  328. >
  329. <el-button
  330. size="small"
  331. type="primary"
  332. link
  333. icon="edit"
  334. @click="editMenu(scope.row.id)"
  335. >编辑</el-button
  336. >
  337. <el-button
  338. size="small"
  339. type="primary"
  340. link
  341. icon="delete"
  342. @click="deleteMenu(scope.row.id)"
  343. >删除</el-button
  344. >
  345. </template>
  346. </el-table-column>
  347. </el-table>
  348. <!-- </el-scrollbar> -->
  349. <div class="gva-pagination">
  350. <el-pagination
  351. :current-page="page"
  352. :page-size="pageSize"
  353. :page-sizes="[10, 20, 30, 50, 100]"
  354. :total="total"
  355. layout="total, sizes, prev, pager, next, jumper"
  356. @current-change="handleCurrentChange"
  357. @size-change="handleSizeChange"
  358. />
  359. </div>
  360. </div>
  361. <el-dialog v-model="dialogFormVisible" :title="dialogTitle">
  362. <el-form
  363. v-if="dialogFormVisible"
  364. ref="menuForm"
  365. :inline="true"
  366. :model="form"
  367. :rules="rules"
  368. label-position="left"
  369. label-width="85px"
  370. >
  371. <el-row :gutter="10">
  372. <el-col :span="6">
  373. <el-form-item label="电脑编号" prop="pc_num">
  374. <el-input v-model="form.pc_num" />
  375. </el-form-item>
  376. </el-col>
  377. <el-col :span="6">
  378. <el-form-item label="电脑名称" prop="pc_name">
  379. <el-input v-model="form.pc_name" />
  380. </el-form-item>
  381. </el-col>
  382. <el-col :span="6">
  383. <el-form-item label="供应商" prop="shop_id">
  384. <el-select v-model="form.shop_id">
  385. <el-option
  386. v-for="item in shopOptions"
  387. :key="item.value"
  388. :label="item.label"
  389. :value="item.value"
  390. />
  391. </el-select>
  392. </el-form-item>
  393. </el-col>
  394. <el-col :span="6">
  395. <el-form-item label="套餐名" prop="set_meal_id">
  396. <el-select v-model="form.set_meal_id">
  397. <el-option
  398. v-for="item in setMealOptions"
  399. :key="item.value"
  400. :label="item.label"
  401. :value="item.value"
  402. />
  403. </el-select>
  404. </el-form-item>
  405. </el-col>
  406. <el-col :span="6">
  407. <el-form-item label="使用人" prop="director_name">
  408. <el-select v-model="form.director_name" size="small">
  409. <el-option
  410. v-for="item in directorOptions"
  411. :key="item.value"
  412. :label="item.label"
  413. :value="item.value"
  414. />
  415. </el-select>
  416. </el-form-item>
  417. </el-col>
  418. </el-row>
  419. <el-row :gutter="10">
  420. <el-col :span="6">
  421. <el-form-item label="Todesk号" prop="todesk_id">
  422. <el-input v-model="form.todesk_id" />
  423. </el-form-item>
  424. </el-col>
  425. <el-col :span="6">
  426. <el-form-item label="Todesk密码" prop="todesk_password">
  427. <el-input v-model="form.todesk_password" />
  428. </el-form-item>
  429. </el-col>
  430. <el-col :span="6">
  431. <el-form-item label="向日葵号" prop="sunflower_id">
  432. <el-input v-model="form.sunflower_id" />
  433. </el-form-item>
  434. </el-col>
  435. <el-col :span="6">
  436. <el-form-item label="向日葵密码" prop="sunflower_password">
  437. <el-input v-model="form.sunflower_password" />
  438. </el-form-item>
  439. </el-col>
  440. </el-row>
  441. <el-row :gutter="10">
  442. <el-col :span="8">
  443. <el-form-item label="起租时间" prop="rent_start">
  444. <el-date-picker
  445. v-model="form.rent_start"
  446. type="datetime"
  447. placeholder="起租时间"
  448. :default-time="defaultTime"
  449. @change="calculateRentDuration(form)"
  450. />
  451. </el-form-item>
  452. </el-col>
  453. <el-col :span="6">
  454. <el-form-item label="租赁天数" prop="rent_duration">
  455. <el-input
  456. v-model="form.rent_duration"
  457. @change="calculateRentDuration(form)"
  458. />
  459. </el-form-item>
  460. </el-col>
  461. <el-col :span="8">
  462. <el-form-item label="到期时间" prop="rent_end">
  463. <el-date-picker
  464. v-model="form.rent_end"
  465. type="datetime"
  466. placeholder="到期时间"
  467. :default-time="defaultTime"
  468. readonly
  469. />
  470. </el-form-item>
  471. </el-col>
  472. </el-row>
  473. <el-row :gutter="10">
  474. <el-col :span="12">
  475. <el-form-item label="是否到期" prop="is_expire">
  476. <el-radio-group v-model="form.is_expire">
  477. <el-radio :label="0" size="large">在租期中</el-radio>
  478. <el-radio :label="1" size="large">到期未续</el-radio>
  479. <el-radio :label="2" size="large">明日到期</el-radio>
  480. </el-radio-group>
  481. </el-form-item>
  482. </el-col>
  483. </el-row>
  484. <!-- <el-row :gutter="10">
  485. <el-col :span="12">
  486. <el-form-item label="是否下架" prop="is_off_shelf">
  487. <el-switch v-model="form.is_off_shelf" />
  488. </el-form-item>
  489. </el-col>
  490. </el-row> -->
  491. <el-row :gutter="10">
  492. <el-col :span="20">
  493. <el-form-item label="备注" prop="remark">
  494. <el-input
  495. v-model="form.remark"
  496. type="textarea"
  497. :rows="4"
  498. style="width: 500px"
  499. />
  500. </el-form-item>
  501. </el-col>
  502. </el-row>
  503. </el-form>
  504. <template #footer>
  505. <div class="dialog-footer">
  506. <el-button size="small" @click="closeDialog">取 消</el-button>
  507. <el-button size="small" type="primary" @click="enterDialog"
  508. >确 定</el-button
  509. >
  510. </div>
  511. </template>
  512. </el-dialog>
  513. <el-dialog title="租机续费" v-model="visible_renew">
  514. <el-form :model="renewForm" size="default" label-width="100px">
  515. <el-row>
  516. <el-form-item label="警告:" prop="">
  517. <el-col :span="24">
  518. <p style="color: red; font-size: larger">请勿随意操作!!!</p>
  519. </el-col>
  520. </el-form-item>
  521. </el-row>
  522. <el-row>
  523. <el-form-item label="租机编号" prop="pc_num">
  524. <el-col :span="12">
  525. <el-input
  526. v-model="renewForm.pc_num"
  527. placeholder="租机编号"
  528. :disabled="true"
  529. ></el-input>
  530. </el-col>
  531. </el-form-item>
  532. <el-form-item label="续费时间" prop="rent_renew">
  533. <el-col>
  534. <el-date-picker
  535. v-model="renewForm.rent_renew"
  536. format="YYYY-MM-DD HH:mm:ss"
  537. type="datetime"
  538. :style="{ width: '100%' }"
  539. placeholder="请选择日期"
  540. clearable
  541. @change="calculateRenewDay(renewForm)"
  542. ></el-date-picker>
  543. </el-col>
  544. </el-form-item>
  545. </el-row>
  546. <el-row>
  547. <el-form-item label="续费天数" prop="">
  548. <el-col :span="24">
  549. <el-tag :key="renewForm.day" type="warning" effect="light">
  550. {{ renewForm.day }}
  551. </el-tag>
  552. </el-col>
  553. </el-form-item>
  554. </el-row>
  555. <el-divider />
  556. <el-form-item>
  557. <el-button size="small" @click="visible_renew = false"
  558. >取消</el-button
  559. >
  560. <el-button type="primary" size="small" @click="renew(renewForm)"
  561. >提交</el-button
  562. >
  563. </el-form-item>
  564. </el-form>
  565. </el-dialog>
  566. <!--退租-->
  567. <el-dialog title="租机退租" v-model="visible_rentingOut">
  568. <el-form
  569. ref="elForm"
  570. :model="rentingOutForm"
  571. size="medium"
  572. label-width="100px"
  573. >
  574. <el-row>
  575. <el-form-item label="警告:" prop="">
  576. <el-col :span="24">
  577. <p style="color: red; font-size: larger">请勿随意操作!!!</p>
  578. </el-col>
  579. </el-form-item>
  580. </el-row>
  581. <el-row>
  582. <el-form-item label="租机编号" prop="pc_num">
  583. <el-col :span="12">
  584. <el-input
  585. v-model="rentingOutForm.pc_num"
  586. placeholder="租机编号"
  587. :disabled="true"
  588. ></el-input>
  589. </el-col>
  590. </el-form-item>
  591. <el-form-item label="退租时间" prop="rent_end">
  592. <el-col>
  593. <el-date-picker
  594. v-model="rentingOutForm.rent_end"
  595. format="YYYY-MM-DD HH:mm:ss"
  596. type="datetime"
  597. :style="{ width: '100%' }"
  598. placeholder="请选择日期"
  599. clearable
  600. @change="calculateRentDay(rentingOutForm)"
  601. ></el-date-picker>
  602. </el-col>
  603. </el-form-item>
  604. </el-row>
  605. <el-row>
  606. <el-form-item label="剩余天数" prop="">
  607. <el-col :span="24">
  608. <el-tag :key="rentingOutForm.day" type="warning" effect="light">
  609. {{ rentingOutForm.day }}
  610. </el-tag>
  611. </el-col>
  612. </el-form-item>
  613. </el-row>
  614. <el-row
  615. ><el-col :span="12" style="margin-left: 30px"
  616. ><el-button size="small" @click="addCardMsg()"
  617. >匀时间</el-button
  618. ></el-col
  619. ></el-row
  620. >
  621. <el-row>
  622. <div class="container-scrollbar">
  623. <el-scrollbar max-height="200px">
  624. <el-row
  625. :gutter="24"
  626. v-for="(item, index) in cardList"
  627. :key="index"
  628. >
  629. <el-col :span="10">
  630. <el-form-item label="租机编号">
  631. <el-input v-model="item.pc_num"></el-input>
  632. </el-form-item>
  633. </el-col>
  634. <el-col :span="8">
  635. <el-form-item label="增加天数">
  636. <el-input v-model="item.add_day"></el-input>
  637. </el-form-item>
  638. </el-col>
  639. <el-col :span="2" v-if="cardList.length !== 1">
  640. <el-button
  641. size="mini"
  642. circle
  643. icon="delete"
  644. @click="deleteCardMsg(index)"
  645. ></el-button>
  646. </el-col>
  647. </el-row>
  648. </el-scrollbar>
  649. </div>
  650. </el-row>
  651. <el-divider />
  652. <el-form-item>
  653. <el-button size="small" @click="visible_rentingOut = false"
  654. >取消</el-button
  655. >
  656. <el-button
  657. type="primary"
  658. size="small"
  659. @click="rentingOut(rentingOutForm)"
  660. >提交</el-button
  661. >
  662. </el-form-item>
  663. </el-form>
  664. </el-dialog>
  665. <!--租机编号更换-->
  666. <el-dialog title="租机编号更换" v-model="visible_replaceNum">
  667. <el-form
  668. ref="elForm"
  669. :model="replaceNumForm"
  670. size="medium"
  671. label-width="100px"
  672. >
  673. <el-row>
  674. <el-form-item label="警告:" prop="">
  675. <el-col :span="24">
  676. <p style="color: red; font-size: larger">
  677. 请勿随意更换,会影响租机续费
  678. </p>
  679. </el-col>
  680. </el-form-item>
  681. </el-row>
  682. <el-row>
  683. <el-form-item label="供应商:" prop="shop_name">
  684. <el-col :span="24">
  685. <p>
  686. <span style="color: red; font-size: larger">{{
  687. replaceNumForm.shop_name
  688. }}</span
  689. >, 只可更改为同一供应商的编号
  690. </p>
  691. </el-col>
  692. </el-form-item>
  693. </el-row>
  694. <el-row>
  695. <el-form-item label="原租机编号" prop="pc_num_old">
  696. <el-col :span="24">
  697. <el-input
  698. v-model="replaceNumForm.pc_num_old"
  699. placeholder="原租机编号"
  700. :disabled="true"
  701. ></el-input>
  702. </el-col>
  703. </el-form-item>
  704. <el-form-item label="更换编号" prop="pc_num_new">
  705. <el-col :span="24">
  706. <el-input
  707. v-model="replaceNumForm.pc_num_new"
  708. placeholder="更换编号"
  709. ></el-input>
  710. </el-col>
  711. </el-form-item>
  712. </el-row>
  713. <el-divider />
  714. <el-form-item>
  715. <el-button size="small" @click="visible_replaceNum = false"
  716. >取消</el-button
  717. >
  718. <el-button
  719. type="primary"
  720. size="small"
  721. @click="replaceNum(replaceNumForm)"
  722. >提交</el-button
  723. >
  724. </el-form-item>
  725. </el-form>
  726. </el-dialog>
  727. </div>
  728. </template>
  729. <script>
  730. export default {
  731. name: "computer",
  732. };
  733. </script>
  734. <script setup>
  735. import {
  736. getRentComputerList,
  737. getRentComputerNum,
  738. listRentComputerShopList,
  739. listRentSetMealList,
  740. getRentComputerById,
  741. addRentComputer,
  742. editRentComputer,
  743. deleteRentComputerById,
  744. deleteRentComputerByIds,
  745. renewRentComputer,
  746. replaceNumRentComputer,
  747. rentingOutRentComputer,
  748. offShelfRentComputer,
  749. } from "@/api/rentComputer";
  750. import { getDirectorList } from "@/api/responsiblePerson";
  751. import { useUserStore } from "@/pinia/modules/user";
  752. import { toSQLLine } from "@/utils/stringFun";
  753. import { ref } from "vue";
  754. import { ElMessage, ElMessageBox } from "element-plus";
  755. import { formatDate } from "@/utils/format";
  756. import { downloadTemplate } from "@/api/excel";
  757. import dayjs from "dayjs";
  758. const apis = ref([]);
  759. const form = ref({
  760. id: 0,
  761. pc_num: "",
  762. pc_name: "",
  763. shop_id: null,
  764. set_meal_id: null,
  765. todesk_id: "",
  766. todesk_password: "",
  767. sunflower_id: "",
  768. sunflower_password: "",
  769. rent_start: new Date(),
  770. rent_duration: 0,
  771. rent_end: new Date(),
  772. remark: "",
  773. is_expire: -1,
  774. is_off_shelf: -1,
  775. director_name: "ALL",
  776. });
  777. const rules = ref({
  778. pc_num: [{ required: true, message: "请输入电脑编号", trigger: "blur" }],
  779. pc_name: [{ required: true, message: "请输入电脑名称", trigger: "blur" }],
  780. shop_id: [{ required: true, message: "请选择供应商", trigger: "blur" }],
  781. set_meal_id: [{ required: true, message: "请选择套餐", trigger: "blur" }],
  782. rent_start: [{ required: true, message: "请选择起租日期", trigger: "blur" }],
  783. rent_duration: [
  784. { required: true, message: "请输入租赁天数", trigger: "blur" },
  785. ],
  786. is_expire: [{ required: true, message: "请选择是否到期", trigger: "blur" }],
  787. is_off_shelf: [
  788. { required: true, message: "请选择是否下架", trigger: "blur" },
  789. ],
  790. });
  791. const page = ref(1);
  792. const total = ref(0);
  793. const pageSize = ref(20);
  794. const tableData = ref([]);
  795. const loading = ref(false);
  796. const searchInfo = ref({});
  797. const computerNum = ref("");
  798. const shopOptions = ref();
  799. const directorOptions = ref();
  800. const setMealOptions = ref();
  801. const defaultTime = ref(new Date(2000, 1, 1, 12, 0, 0));
  802. const path = ref(import.meta.env.VITE_BASE_API);
  803. const userStore = useUserStore();
  804. const visible_renew = ref(false);
  805. const visible_rentingOut = ref(false);
  806. const visible_replaceNum = ref(false);
  807. const rent_end = ref("");
  808. const renewForm = ref({
  809. pc_num: "",
  810. pc_id: 0,
  811. day: 0,
  812. rent_renew: dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss"),
  813. });
  814. const rentingOutForm = ref({
  815. pc_num: "",
  816. pc_id: 0,
  817. day: 0,
  818. rent_end: dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss"),
  819. addList: [],
  820. });
  821. const replaceNumForm = ref({
  822. pc_num_old: "",
  823. pc_num_new: "",
  824. shop_id: 0,
  825. shop_name: "",
  826. });
  827. let cardList = ref([]);
  828. // 计算租机到期时间
  829. const calculateRentDuration = async (scope) => {
  830. scope.rent_end = new Date(
  831. Date.parse(scope.rent_start) +
  832. 1 * 24 * 60 * 60 * 1000 * parseInt(scope.rent_duration)
  833. );
  834. };
  835. // 计算退租剩余时间
  836. function calculateRentDay(scope) {
  837. if (Date.parse(rent_end.value) < Date.parse(scope.rent_end)) {
  838. scope.rent_end = rent_end.value;
  839. ElMessage.error("退租时间不能大于到期时间");
  840. }
  841. scope.day = Math.ceil(
  842. parseInt(
  843. (Date.parse(rent_end.value) - Date.parse(scope.rent_end)) /
  844. (24 * 60 * 60 * 1000) +
  845. ""
  846. )
  847. );
  848. // console.log(scope.day);
  849. }
  850. // 计算续费时间
  851. function calculateRenewDay(scope) {
  852. if (Date.parse(rent_end.value) >= Date.parse(scope.rent_renew)) {
  853. scope.rent_renew = rent_end.value;
  854. ElMessage.error("续费时间不能小于到期时间");
  855. visible_renew.value = false;
  856. }
  857. scope.day = Math.ceil(
  858. parseInt(
  859. (Date.parse(scope.rent_renew) - Date.parse(rent_end.value)) /
  860. (24 * 60 * 60 * 1000) +
  861. ""
  862. )
  863. );
  864. }
  865. // 拉起续费弹窗
  866. async function switchRenew(rowData) {
  867. // console.log(rowData);
  868. renewForm.value.pc_num = rowData.pc_num;
  869. renewForm.value.pc_id = rowData.id;
  870. renewForm.value.rent_renew = rowData.rent_end;
  871. renewForm.value.day = 0;
  872. rent_end.value = rowData.rent_end;
  873. // console.log(renewForm);
  874. if (visible_renew.value == false) {
  875. visible_renew.value = true;
  876. }
  877. }
  878. // 续费
  879. async function renew(rowData) {
  880. let doForm = {
  881. pc_num: rowData.pc_num,
  882. pc_id: rowData.pc_id,
  883. rent_renew: dayjs(new Date(rowData.rent_renew)).format(
  884. "YYYY-MM-DD HH:mm:ss"
  885. ),
  886. day: rowData.day,
  887. };
  888. // renewRentComputer
  889. const data = await renewRentComputer(doForm);
  890. if (data.code == 0) {
  891. visible_renew.value = false;
  892. ElMessage.success(data.msg);
  893. getTableData();
  894. } else {
  895. ElMessage.error(data.msg);
  896. }
  897. }
  898. // 拉起退租弹窗
  899. async function switchRentingOut(rowData) {
  900. cardList.value = [];
  901. rentingOutForm.value.pc_num = rowData.pc_num;
  902. rentingOutForm.value.pc_id = rowData.id;
  903. rentingOutForm.value.rent_end = dayjs(new Date(rowData.rent_end)).format(
  904. "YYYY-MM-DD HH:mm:ss"
  905. );
  906. rentingOutForm.value.day = 0;
  907. rent_end.value = rowData.rent_end;
  908. if (visible_rentingOut.value == false) {
  909. visible_rentingOut.value = true;
  910. }
  911. }
  912. function addCardMsg() {
  913. let hasFlag = false;
  914. for (let i = 0; i < cardList.value.length; i++) {
  915. if (
  916. cardList.value[i].pc_num == "" ||
  917. cardList.value[i].add_day == undefined
  918. ) {
  919. hasFlag = true;
  920. break;
  921. }
  922. }
  923. if (hasFlag == true) {
  924. ElMessage.error("有未填写项");
  925. } else {
  926. cardList.value.push({
  927. pc_id: "",
  928. add_day: null,
  929. });
  930. }
  931. }
  932. function deleteCardMsg(index) {
  933. cardList.value.splice(index, 1);
  934. }
  935. // 退租
  936. async function rentingOut(rowData) {
  937. var numDay = 0;
  938. let AddList = [];
  939. cardList.value.forEach((e) => {
  940. numDay += e.add_day;
  941. let temp = {
  942. pc_num: e.pc_num,
  943. add_day: Number(e.add_day),
  944. };
  945. AddList.push(temp);
  946. });
  947. if (numDay != rowData.day) {
  948. ElMessage.error("匀时间天数错误!!!");
  949. return;
  950. }
  951. let doForm = {
  952. pc_id: rowData.pc_id,
  953. rent_end: dayjs(new Date(rowData.rent_end)).format("YYYY-MM-DD HH:mm:ss"),
  954. add_list: AddList,
  955. };
  956. const data = await rentingOutRentComputer(doForm);
  957. // console.log(data)
  958. if (data.code == 0) {
  959. visible_rentingOut.value = false;
  960. ElMessage.success(data.msg);
  961. getTableData();
  962. } else {
  963. // ElMessage.error(data.msg);
  964. }
  965. }
  966. // 拉起换编号弹窗
  967. async function switchReplaceNum(rowData) {
  968. replaceNumForm.value.pc_num_old = rowData.pc_num;
  969. replaceNumForm.value.shop_id = rowData.shop_id;
  970. replaceNumForm.value.shop_name = rowData.shop_name;
  971. if (visible_replaceNum.value == false) {
  972. visible_replaceNum.value = true;
  973. }
  974. }
  975. // 换编
  976. async function replaceNum(rowData) {
  977. let doForm = {
  978. pc_num_old: rowData.pc_num_old,
  979. pc_num_new: rowData.pc_num_new,
  980. shop_id: rowData.shop_id,
  981. };
  982. const data = await replaceNumRentComputer(doForm);
  983. // console.log(data)
  984. if (data.code == 0) {
  985. visible_replaceNum.value = false;
  986. ElMessage.success(data.msg);
  987. getTableData();
  988. } else {
  989. // ElMessage.error(data.msg);
  990. }
  991. }
  992. const downloadExcelTemplate = () => {
  993. downloadTemplate("RentComputerTemplate.xlsx");
  994. };
  995. // 删除/下架
  996. async function offShelf(rowData) {
  997. let message = "确定要下架编号为" + rowData.pc_num + "的租机吗?";
  998. if (rowData.is_expire != 1) {
  999. message = "机器未到期,确定强制下架编号为" + rowData.pc_num + "的租机吗?";
  1000. }
  1001. let doForm = {
  1002. id: rowData.id,
  1003. pc_num: rowData.pc_num,
  1004. };
  1005. // console.log(doForm);
  1006. ElMessageBox.confirm(message, "租机下架", {
  1007. dangerouslyUseHTMLString: true,
  1008. type: "warning",
  1009. })
  1010. .then(async () => {
  1011. const data = await offShelfRentComputer(doForm);
  1012. if (data.code == 0) {
  1013. ElMessage.success(data.msg);
  1014. getTableData();
  1015. } else {
  1016. ElMessage.error(data.msg);
  1017. }
  1018. })
  1019. .catch(() => null);
  1020. }
  1021. // 分页
  1022. const handleSizeChange = (val) => {
  1023. pageSize.value = val;
  1024. getTableData();
  1025. };
  1026. const onReset = () => {
  1027. searchInfo.value = {};
  1028. };
  1029. const handleCurrentChange = (val) => {
  1030. page.value = val;
  1031. getTableData();
  1032. };
  1033. // 排序
  1034. const sortChange = ({ prop, order }) => {
  1035. if (prop) {
  1036. if (prop === "id") {
  1037. prop = "id";
  1038. }
  1039. searchInfo.value.orderKey = toSQLLine(prop);
  1040. searchInfo.value.desc = order === "descending";
  1041. }
  1042. getTableData();
  1043. };
  1044. // 搜索
  1045. const onSubmit = () => {
  1046. page.value = 1;
  1047. pageSize.value = 20;
  1048. if (typeof searchInfo.value.set_meal_id != "undefined") {
  1049. searchInfo.value.set_meal_id = Number(searchInfo.value.set_meal_id);
  1050. }
  1051. if (typeof searchInfo.value.is_expire != "undefined") {
  1052. searchInfo.value.is_expire = Number(searchInfo.value.is_expire);
  1053. }
  1054. if (typeof searchInfo.value.is_off_shelf != "undefined") {
  1055. searchInfo.value.is_off_shelf = Number(searchInfo.value.is_off_shelf);
  1056. }
  1057. // console.log(searchInfo);
  1058. getTableData();
  1059. };
  1060. // 查询
  1061. const getTableData = async () => {
  1062. loading.value = true;
  1063. const table = await getRentComputerList({
  1064. page: page.value,
  1065. pageSize: pageSize.value,
  1066. ...searchInfo.value,
  1067. });
  1068. if (table.code === 0) {
  1069. tableData.value = table.data.list;
  1070. total.value = table.data.total;
  1071. page.value = table.data.page;
  1072. pageSize.value = table.data.pageSize;
  1073. // getSpanArr(table.data.list);
  1074. getComputerNum();
  1075. getSelectList();
  1076. }
  1077. loading.value = false;
  1078. };
  1079. //获取下拉框list
  1080. const getSelectList = async () => {
  1081. //listRentComputerShopList
  1082. const rentComputerShop = await listRentComputerShopList({
  1083. page: 1,
  1084. pageSize: 999,
  1085. });
  1086. let rentComputerShopList = [];
  1087. const data = rentComputerShop.data.list;
  1088. data.forEach((e) => {
  1089. rentComputerShopList.push({ value: e.id, label: e.name });
  1090. });
  1091. shopOptions.value = rentComputerShopList;
  1092. //listRentSetMealList
  1093. const setMealShop = await listRentSetMealList({
  1094. page: 1,
  1095. pageSize: 999,
  1096. });
  1097. let setMealList = [];
  1098. const data2 = setMealShop.data.list;
  1099. data2.forEach((e) => {
  1100. var priceStr = "";
  1101. if (e.price_type == 0) {
  1102. priceStr = "天卡(" + e.rent_price + "元)";
  1103. } else if (e.price_type == 1) {
  1104. priceStr = "周卡(" + e.rent_price + "元)";
  1105. } else {
  1106. priceStr = "月卡(" + e.rent_price + "元)";
  1107. }
  1108. setMealList.push({
  1109. value: e.id,
  1110. label: e.shop_name + "-" + e.name + "-" + priceStr,
  1111. });
  1112. });
  1113. setMealOptions.value = setMealList;
  1114. //游戏负责人列表===============================
  1115. const directorRes = await getDirectorList();
  1116. let directorList = [
  1117. { value: "ALL", label: "所有机器" },
  1118. { value: "", label: "备用" },
  1119. ];
  1120. const data3 = directorRes.data.list;
  1121. data3.forEach((e) => {
  1122. directorList.push({ value: e.name, label: e.name });
  1123. });
  1124. directorOptions.value = directorList;
  1125. };
  1126. // 查询
  1127. const getComputerNum = async () => {
  1128. const table = await getRentComputerNum({ ...searchInfo.value });
  1129. if (table.code === 0) {
  1130. // console.log(table.data);
  1131. computerNum.value = table.data;
  1132. }
  1133. };
  1134. //拉起TD连接
  1135. const linkTd = async (row) => {
  1136. let todesk_id = row.todesk_id;
  1137. let todesk_password = row.todesk_password;
  1138. todesk_id = todesk_id.replace(/\s*/g, "");
  1139. todesk_password = todesk_password.replace(/\s*/g, "");
  1140. console.log(todesk_id);
  1141. console.log(todesk_password);
  1142. if (todesk_id == "" || todesk_password == "") {
  1143. ElMessage({
  1144. type: "error",
  1145. message: "todesk账号密码不完整!",
  1146. });
  1147. } else {
  1148. window.location.href =
  1149. "ToDesk://connect&" + todesk_id + "&" + todesk_password;
  1150. }
  1151. };
  1152. getTableData();
  1153. // 批量操作
  1154. const handleSelectionChange = (val) => {
  1155. apis.value = val;
  1156. };
  1157. const dialogFormVisible = ref(false);
  1158. // 弹窗相关
  1159. const menuForm = ref(null);
  1160. const checkFlag = ref(false);
  1161. const initForm = () => {
  1162. checkFlag.value = false;
  1163. menuForm.value.resetFields();
  1164. form.value = {
  1165. id: 0,
  1166. coding: "",
  1167. describe: "",
  1168. parent_id: "",
  1169. };
  1170. };
  1171. const menuOption = ref([
  1172. {
  1173. id: "0",
  1174. title: "根编号",
  1175. },
  1176. ]);
  1177. const setOptions = () => {
  1178. menuOption.value = [
  1179. {
  1180. id: "0",
  1181. title: "根目录",
  1182. },
  1183. ];
  1184. setMenuOptions(tableData.value, menuOption.value, false);
  1185. };
  1186. const setMenuOptions = (menuData, optionsData, disabled) => {
  1187. menuData &&
  1188. menuData.forEach((item) => {
  1189. if (item.children && item.children.length) {
  1190. const option = {
  1191. ID: String(item.id),
  1192. disabled: disabled || item.id === form.value.id,
  1193. children: [],
  1194. };
  1195. setMenuOptions(
  1196. item.children,
  1197. option.children,
  1198. disabled || item.id === form.value.id
  1199. );
  1200. optionsData.push(option);
  1201. } else {
  1202. const option = {
  1203. ID: String(item.id),
  1204. disabled: disabled || item.id === form.value.id,
  1205. };
  1206. optionsData.push(option);
  1207. }
  1208. });
  1209. };
  1210. const loadExcel = (res) => {
  1211. if (res.code === 0) {
  1212. ElMessage({
  1213. type: "success",
  1214. message: res.msg,
  1215. });
  1216. } else {
  1217. ElMessage({
  1218. type: "error",
  1219. message: res.msg,
  1220. showClose: true,
  1221. });
  1222. }
  1223. getTableData();
  1224. };
  1225. // 添加菜单方法,id为 0则为添加根菜单
  1226. const isEdit = ref(false);
  1227. const dialogTitle = ref("新增租机");
  1228. const addMenu = async (id) => {
  1229. dialogTitle.value = "新增租机";
  1230. form.value.parent_id = String(id);
  1231. isEdit.value = false;
  1232. setOptions();
  1233. dialogFormVisible.value = true;
  1234. getSelectList();
  1235. };
  1236. // 修改菜单方法
  1237. const editMenu = async (id) => {
  1238. dialogTitle.value = "编辑租机";
  1239. const res = await getRentComputerById({ id });
  1240. form.value = res.data;
  1241. // console.log(form.value);
  1242. if (form.value.is_off_shelf == 1) {
  1243. form.value.is_off_shelf = true;
  1244. } else {
  1245. form.value.is_off_shelf = false;
  1246. }
  1247. isEdit.value = true;
  1248. setOptions();
  1249. dialogFormVisible.value = true;
  1250. getSelectList();
  1251. };
  1252. const closeDialog = () => {
  1253. initForm();
  1254. dialogFormVisible.value = false;
  1255. };
  1256. // 批量删除菜单
  1257. const deletesMenu = async () => {
  1258. ElMessageBox.confirm("确定批量删除所选吗?", "提示", {
  1259. confirmButtonText: "确定",
  1260. cancelButtonText: "取消",
  1261. type: "warning",
  1262. })
  1263. .then(async () => {
  1264. const ids = apis.value.map((item) => item.id);
  1265. // console.log(ids);
  1266. const res = await deleteRentComputerByIds({ ids });
  1267. if (res.code === 0) {
  1268. ElMessage({
  1269. type: "success",
  1270. message: "删除成功!",
  1271. });
  1272. getTableData();
  1273. }
  1274. })
  1275. .catch(() => {
  1276. ElMessage({
  1277. type: "info",
  1278. message: "已取消删除",
  1279. });
  1280. });
  1281. };
  1282. // 删除菜单
  1283. const deleteMenu = async (id) => {
  1284. ElMessageBox.confirm("确定删除?", "提示", {
  1285. confirmButtonText: "确定",
  1286. cancelButtonText: "取消",
  1287. type: "warning",
  1288. })
  1289. .then(async () => {
  1290. console.log(id);
  1291. const res = await deleteRentComputerById({ id });
  1292. if (res.code === 0) {
  1293. ElMessage({
  1294. type: "success",
  1295. message: "删除成功!",
  1296. });
  1297. getTableData();
  1298. }
  1299. })
  1300. .catch(() => {
  1301. ElMessage({
  1302. type: "info",
  1303. message: "已取消删除",
  1304. });
  1305. });
  1306. };
  1307. const enterDialog = async () => {
  1308. // console.log(form.value);
  1309. menuForm.value.validate(async (valid) => {
  1310. if (valid) {
  1311. let res;
  1312. form.value.id = Number(form.value.id);
  1313. form.value.shop_id = Number(form.value.shop_id);
  1314. form.value.set_meal_id = Number(form.value.set_meal_id);
  1315. form.value.rent_duration = Number(form.value.rent_duration);
  1316. form.value.rent_start = formatDate(form.value.rent_start);
  1317. form.value.rent_end = formatDate(form.value.rent_end);
  1318. form.value.is_expire = Number(form.value.is_expire);
  1319. if (form.value.is_off_shelf == true) {
  1320. form.value.is_off_shelf = 1;
  1321. } else {
  1322. form.value.is_off_shelf = 0;
  1323. }
  1324. if (isEdit.value) {
  1325. res = await editRentComputer(form.value);
  1326. } else {
  1327. res = await addRentComputer(form.value);
  1328. }
  1329. if (res.code === 0) {
  1330. ElMessage({
  1331. type: "success",
  1332. message: isEdit.value ? "编辑成功" : "添加成功!",
  1333. });
  1334. getTableData();
  1335. } else {
  1336. ElMessage({
  1337. type: "error",
  1338. message: res.message,
  1339. });
  1340. }
  1341. initForm();
  1342. dialogFormVisible.value = false;
  1343. }
  1344. });
  1345. };
  1346. </script>
  1347. <style scoped lang="scss">
  1348. .button-box {
  1349. padding: 10px 20px;
  1350. .el-button {
  1351. float: right;
  1352. }
  1353. }
  1354. .warning {
  1355. color: #dc143c;
  1356. }
  1357. </style>