boilerDetail.vue 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851
  1. <template>
  2. <div class="app-container">
  3. <!-- 受检信息表单 -->
  4. <ContentWrap title="受检信息">
  5. <el-form :model="formData" :rules="formRules" ref="formRef" label-width="120px" class="p-3">
  6. <!-- <div class="check-info-label-title">受理单位</div> -->
  7. <div class="check-info-label-title">单位信息 </div>
  8. <el-row class="form-group" :gutter="24">
  9. <el-col :span="8">
  10. <!-- 申请单位名称 unitName -->
  11. <el-form-item label="申请单位名称" prop="unitName" class="unit-form-item">
  12. <el-input v-if="useInputUnitName" v-model="formData.unitName.name" placeholder="请输入单位名称" :maxlength="50" />
  13. <CustomLargeListSelect
  14. v-else
  15. v-model:modelValue="formData.unitName"
  16. :fetchFunc="getUnitNewList"
  17. label-key="name"
  18. value-key="id"
  19. searchKeyProp="name"
  20. @change="handleChangeUnit"
  21. />
  22. <el-button type="primary" link @click="() => useInputUnitName = !useInputUnitName">{{useInputUnitName ? '选择单位' : '手动输入'}}</el-button>
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="8">
  26. <!-- 统一社会信用代码 socialCreditCode -->
  27. <el-form-item label="统一社会信用代码" prop="socialCreditCode" label-width="120px">
  28. <el-input v-model="formData.socialCreditCode" placeholder="请输入统一社会信用代码" :maxlength="50"/>
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="8">
  32. <!-- 申请单位地址 unitAddress -->
  33. <el-form-item label="申请单位地址" prop="unitAddress" label-width="120px">
  34. <el-input v-model="formData.unitAddress" placeholder="请输入申请单位地址" :maxlength="50"/>
  35. </el-form-item>
  36. </el-col>
  37. <el-col :span="8">
  38. <!-- 邮政编码 zipCode -->
  39. <el-form-item label="申请单位邮政编码" prop="zipCode">
  40. <el-input v-model="formData.zipCode" placeholder="请输入申请单位邮政编码" :maxlength="50"/>
  41. </el-form-item>
  42. </el-col>
  43. <el-col :span="8">
  44. <el-form-item label="检验性质" prop="checkType" label-width="120px">
  45. <el-select disabled v-model="formData.checkType" placeholder="请选择检验性质" clearable>
  46. <el-option
  47. v-for="(item, key) in checkStatusMap"
  48. :key="key"
  49. :label="item"
  50. :value="key"
  51. />
  52. </el-select>
  53. </el-form-item>
  54. </el-col>
  55. <!-- <el-col :span="8">
  56. <el-form-item label="检验性质" prop="checkType" label-width="120px">
  57. <el-select v-model="formData.checkType" placeholder="请选择检验性质" clearable disabled>
  58. <el-option
  59. v-for="(item, key) in checkStatusMap"
  60. :key="key"
  61. :label="item"
  62. :value="key"
  63. />
  64. </el-select>
  65. </el-form-item>
  66. </el-col> -->
  67. </el-row>
  68. <!-- <div class="check-info-label-title">使用单位</div> -->
  69. <el-row class="form-group" :gutter="24">
  70. <el-col :span="8">
  71. <!-- 使用单位名称 useUnitName -->
  72. <el-form-item label="使用单位名称" prop="useUnitName" class="unit-form-item">
  73. <el-input v-if="useInputUseUnitName" v-model="formData.useUnitName.name" placeholder="请输入使用单位名称" :maxlength="50" @blur="handleChangeUseUnitInput" @keyup.enter="handleChangeUseUnitInput" />
  74. <CustomLargeListSelect
  75. v-else
  76. v-model:modelValue="formData.useUnitName"
  77. :fetchFunc="getUnitNewList"
  78. label-key="name"
  79. value-key="id"
  80. searchKeyProp="name"
  81. @change="handleChangeUseUnit"
  82. />
  83. <el-button type="primary" link @click="() => useInputUseUnitName = !useInputUseUnitName">{{useInputUseUnitName ? '选择单位' : '手动输入'}}</el-button>
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="8">
  87. <!-- 统一社会信用代码 -->
  88. <el-form-item label="统一社会信用代码" prop="useUnitSocialCreditCode" label-width="120px">
  89. <el-input v-model="formData.useUnitSocialCreditCode" placeholder="请输入统一社会信用代码" :maxlength="50"/>
  90. </el-form-item>
  91. </el-col>
  92. <el-col :span="8">
  93. <!-- 使用单位地址 useUnitAddress -->
  94. <el-form-item label="使用单位地址" prop="useUnitAddress" label-width="120px">
  95. <el-input v-model="formData.useUnitAddress" placeholder="请输入使用单位地址" :maxlength="50"/>
  96. </el-form-item>
  97. </el-col>
  98. <el-col :span="8">
  99. <!-- 邮政编码 useUnitZipcode -->
  100. <el-form-item label="使用邮政编码" prop="useUnitZipcode">
  101. <el-input v-model="formData.useUnitZipcode" placeholder="请输入使用邮政编码" :maxlength="50"/>
  102. </el-form-item>
  103. </el-col>
  104. <el-col :span="8">
  105. <!-- 单位联系人 useUnitContact -->
  106. <el-form-item label="单位联系人" prop="useUnitContact" label-width="120px">
  107. <el-input v-model="formData.useUnitContact" placeholder="请输入单位联系人" :maxlength="50"/>
  108. </el-form-item>
  109. </el-col>
  110. <el-col :span="8">
  111. <!-- 联系人电话 useUnitPhone -->
  112. <el-form-item label="联系人电话" prop="useUnitPhone" label-width="120px">
  113. <el-input v-model="formData.useUnitPhone" placeholder="请输入联系人电话" :maxlength="11"/>
  114. </el-form-item>
  115. </el-col>
  116. </el-row>
  117. <div class="check-info-label-title">联系人信息</div>
  118. <el-row class="form-group" :gutter="24">
  119. <el-col :span="8">
  120. <!-- 约检联系人 unitContact -->
  121. <el-form-item label="约检联系人" prop="unitContact">
  122. <el-input v-model="formData.unitContact" placeholder="请输入约检联系人" :maxlength="50"/>
  123. </el-form-item>
  124. </el-col>
  125. <el-col :span="8">
  126. <!-- 约检联系人电话unitPhone -->
  127. <el-form-item label="联系人电话" prop="unitPhone" label-width="120px">
  128. <el-input v-model="formData.unitPhone" placeholder="请输入约检联系人电话" :maxlength="11"/>
  129. </el-form-item>
  130. </el-col>
  131. <el-col :span="8">
  132. <!-- 约检联系人电话email -->
  133. <el-form-item label="联系人邮箱" prop="email" label-width="120px">
  134. <el-input v-model="formData.email" placeholder="请输入约检联系人邮箱"/>
  135. </el-form-item>
  136. </el-col>
  137. <el-col :span="8">
  138. <!-- 电子报告接收人 recipient -->
  139. <el-form-item label="电子报告接收人" prop="recipient" label-width="120px">
  140. <el-input v-model="formData.recipient" placeholder="请输入电子报告接收人" :maxlength="50"/>
  141. </el-form-item>
  142. </el-col>
  143. <el-col :span="8">
  144. <!-- 接收人电话 recipientPhone -->
  145. <el-form-item label="接收人电话" prop="recipientPhone">
  146. <el-input v-model="formData.recipientPhone" placeholder="请输入接收人电话" :maxlength="11"/>
  147. </el-form-item>
  148. </el-col>
  149. <el-col :span="8">
  150. <el-form-item label="接收人邮箱" prop="recipientEmail">
  151. <el-input v-model="formData.recipientEmail" placeholder="请输入接收人邮箱"/>
  152. </el-form-item>
  153. </el-col>
  154. <el-col :span="8">
  155. <el-form-item label="缴费联系人" prop="payerContactName" label-width="120px">
  156. <el-input v-model="formData.payerContactName" placeholder="请输入缴费联系人" :maxlength="50"/>
  157. </el-form-item>
  158. </el-col>
  159. <el-col :span="8">
  160. <!-- 接收人电话 payerContact -->
  161. <el-form-item label="缴费人电话" prop="payerContact">
  162. <el-input v-model="formData.payerContact" placeholder="请输入缴费人电话" :maxlength="11"/>
  163. </el-form-item>
  164. </el-col>
  165. <el-col :span="8">
  166. <el-form-item label="缴费人邮箱" prop="payerMail">
  167. <el-input v-model="formData.payerMail" placeholder="请输入缴费人邮箱"/>
  168. </el-form-item>
  169. </el-col>
  170. </el-row>
  171. <div class="check-info-label-title">受理信息</div>
  172. <el-row class="form-group" :gutter="24">
  173. <el-col :span="8">
  174. <!-- 检验部门 deptId -->
  175. <el-form-item label="检验部门" prop="deptId">
  176. <!-- <el-input v-model="formData.deptId" placeholder="请输入检验部门"/> -->
  177. <DeptSelect
  178. v-model="formData.deptId"
  179. placeholder="请选择部门"
  180. clearable
  181. />
  182. </el-form-item>
  183. </el-col>
  184. <el-col :span="8">
  185. <!-- 联系电话 deptPhone -->
  186. <el-form-item label="联系电话" prop="deptPhone" label-width="120px">
  187. <el-input v-model="formData.deptPhone" placeholder="请输入联系电话" :maxlength="20"/>
  188. </el-form-item>
  189. </el-col>
  190. <el-col :span="8">
  191. <!-- 约检时间 appointmentDate -->
  192. <el-form-item label="约检时间" prop="appointmentDate" label-width="120px">
  193. <el-date-picker
  194. v-model="formData.appointmentDate"
  195. type="date"
  196. value-format="YYYY-MM-DD"
  197. placeholder="请选择约检时间"
  198. :disabled-date="disabledDate"
  199. />
  200. </el-form-item>
  201. </el-col>
  202. <el-col :span="24">
  203. <!-- 检验员 teamList -->
  204. <el-form-item label="检验员" prop="teamList">
  205. <CheckerSelect
  206. ref="checkerSelectRef"
  207. v-model="selectedCheckers"
  208. :dept-id="userStore.getUser.deptId?.toString() || '1'"
  209. :disabled="false"
  210. :has-data="true"
  211. empty-text="暂无检验员数据"
  212. :multiple="true"
  213. @change="handleCheckerChange"
  214. />
  215. </el-form-item>
  216. </el-col>
  217. </el-row>
  218. <div class="check-info-label-title">异常信息</div>
  219. <el-row class="m-b-20px">
  220. <el-button v-if="!exceptionInfo.id" type="primary" @click="addExceptionInfo">添加异常单</el-button>
  221. <el-button v-else type="primary" @click="deleteExceptionInfo">删除异常单</el-button>
  222. </el-row>
  223. <el-row v-if="exceptionInfo.id" class="form-group" :gutter="24">
  224. <el-col :span="8">
  225. <el-form-item label="有效日期调整原因" prop="effectiveDateAdjustReason">
  226. <el-input v-model="exceptionInfo.effectiveDateAdjustReason" placeholder="请输入有效日期调整原因"/>
  227. </el-form-item>
  228. </el-col>
  229. <el-col :span="8">
  230. <el-form-item label="受理建议" prop="acceptSuggeston">
  231. <el-input v-model="exceptionInfo.acceptSuggeston" placeholder="请输入受理建议"/>
  232. </el-form-item>
  233. </el-col>
  234. <el-col :span="8">
  235. <el-form-item label="调整有效日期" prop="adjustEffectiveDate">
  236. <el-date-picker
  237. v-model="exceptionInfo.adjustEffectiveDate"
  238. type="date"
  239. value-format="YYYY-MM-DD"
  240. placeholder="请选择调整有效日期"
  241. />
  242. </el-form-item>
  243. </el-col>
  244. <el-col :span="12">
  245. <el-form-item label="情况说明" prop="descrition">
  246. <component :is="getExceptionItem('descrition', 'descritionAttach')" />
  247. </el-form-item>
  248. </el-col>
  249. <el-col :span="12">
  250. <el-form-item label="重启表" prop="restartTable">
  251. <component :is="getExceptionItem('restartTable', 'restartTableAttach')" />
  252. </el-form-item>
  253. </el-col>
  254. <el-col :span="12">
  255. <el-form-item label="指令书" prop="instrustionBook">
  256. <component :is="getExceptionItem('instrustionBook', 'instrustionBookAttach')" />
  257. </el-form-item>
  258. </el-col>
  259. <el-col :span="12">
  260. <el-form-item label="受理回执" prop="acceptReceipt">
  261. <component :is="getExceptionItem('acceptReceipt', 'acceptReceiptAttach')" />
  262. </el-form-item>
  263. </el-col>
  264. <el-col :span="12">
  265. <el-form-item label="其他" prop="other">
  266. <component :is="getExceptionItem('other', 'otherAttach')" />
  267. </el-form-item>
  268. </el-col>
  269. <el-col :span="12">
  270. <el-form-item label="提前检验申请函" prop="earlyCheckApply">
  271. <component :is="getExceptionItem('earlyCheckApply', 'earlyCheckApplyAttach')" />
  272. </el-form-item>
  273. </el-col>
  274. </el-row>
  275. <div class="check-info-label-title">检验收费</div>
  276. <el-row class="form-group" :gutter="24">
  277. <el-col :span="24">
  278. <!-- 定期检查&超年限检查 -->
  279. <el-form-item label="检验性质" prop="checkType" label-width="120px">
  280. <el-select disabled v-model="formData.checkType" placeholder="请选择检验性质" clearable class="!w-120px">
  281. <el-option
  282. v-for="(item, key) in checkStatusMap"
  283. :key="key"
  284. :label="item"
  285. :value="key"
  286. />
  287. </el-select>
  288. </el-form-item>
  289. <!-- 收费性质 feeNature -->
  290. <el-form-item prop="feeNature" >
  291. <template #label>
  292. <div class="flex flex-col text-right">
  293. <span>收费性质</span>
  294. <span>(行政事业收费)</span>
  295. </div>
  296. </template>
  297. <el-radio-group v-model="formData.feeNature">
  298. <el-radio v-for="(item, key) in PressureFeeNatureMap" :key="key" :value="key" :label="item"/>
  299. </el-radio-group>
  300. </el-form-item>
  301. </el-col>
  302. <el-col :span="24">
  303. <!-- 收费形式 feeType -->
  304. <el-form-item label="收费形式" prop="feeType">
  305. <el-radio-group v-model="formData.feeType">
  306. <el-radio v-for="(item, key) in PressureFeeTypeMap" :key="key" :value="key" :label="item"/>
  307. </el-radio-group>
  308. </el-form-item>
  309. </el-col>
  310. <el-col :span="24">
  311. <!-- 收费金额 actualAmount -->
  312. <!-- <el-form-item label="收费金额" prop="actualAmount" class="actualAmountFormItem">
  313. <el-input-number
  314. :controls="false"
  315. v-model="formData.actualAmount"
  316. placeholder="请输入收费金额"
  317. :min="0"
  318. />
  319. <div style="padding-left: 8px;">大写({{numberToChinese(formData.actualAmount)}})含税</div>
  320. </el-form-item>-->
  321. <div class="flex items-center gap-32 ml-40px text-14px">
  322. <span>应收法定金额: {{ formData.shouldAmount }}</span>
  323. <span>服务收费金额:{{ formData.serviceAmount }}</span>
  324. <span>免征费用: {{ formData.reduceFee }}</span>
  325. </div>
  326. </el-col>
  327. <!-- <el-col :span="24">
  328. &lt;!&ndash; 年度检查 &ndash;&gt;
  329. <el-form-item label="" prop="feeDate" label-width="30" v-if="orderDetail?.checkType == 200">
  330. <div class="feeDate_box">
  331. 甲方在本服务单签订之日起
  332. <el-input-number :controls="false" v-model="formData.feeDate" placeholder="请输入" :maxlength="50"/>
  333. 日内一次性支付。
  334. </div>
  335. </el-form-item>
  336. </el-col>-->
  337. </el-row>
  338. </el-form>
  339. </ContentWrap>
  340. <!-- 设备清单 -->
  341. <ContentWrap title="设备信息">
  342. <!-- 搜索工作栏 -->
  343. <ContentWrap>
  344. <el-form
  345. :model="equipQueryParams"
  346. ref="equipQueryFormRef"
  347. :inline="true"
  348. label-width="80px"
  349. >
  350. <!-- 基本信息查询部分 -->
  351. <div class="flex flex-wrap items-start gap-x-2">
  352. <el-form-item label="设备代码" prop="equipCode">
  353. <el-input
  354. v-model="equipQueryParams.equipCode"
  355. placeholder="请输入设备注册代码"
  356. clearable
  357. @keyup.enter="handleEquipQuery"
  358. class="!w-240px"
  359. />
  360. </el-form-item>
  361. <el-form-item label="部门" prop="deptId">
  362. <DeptSelect
  363. v-model="equipQueryParams.deptId"
  364. placeholder="请选择部门"
  365. clearable
  366. class="!w-240px"
  367. />
  368. </el-form-item>
  369. <el-form-item label="使用状态" prop="useStatus">
  370. <el-select
  371. v-model="equipQueryParams.useStatus"
  372. placeholder="选择使用状态"
  373. clearable
  374. multiple
  375. collapse-tags
  376. collapse-tags-tooltip
  377. class="!w-240px"
  378. >
  379. <el-option
  380. v-for="dict in getStrDictOptions(DICT_TYPE.SYSTEM_EQUIP_BOILER_STATUS)"
  381. :key="dict.value"
  382. :label="dict.label"
  383. :value="dict.value"
  384. />
  385. </el-select>
  386. </el-form-item>
  387. <el-form-item label="临检时间" prop="nextDate">
  388. <div class="flex items-center gap-x-2">
  389. <el-select v-model="datePickerType" class="!w-[90px]">
  390. <el-option label="时间段" value="daterange" />
  391. <el-option label="月份" value="month" />
  392. </el-select>
  393. <el-date-picker
  394. v-if="datePickerType === 'daterange'"
  395. v-model="daterange"
  396. type="daterange"
  397. value-format="YYYY-MM-DD"
  398. start-placeholder="开始日期"
  399. end-placeholder="结束日期"
  400. class="!w-[210px]"
  401. @change="handleDateChange"
  402. />
  403. <el-date-picker
  404. v-else
  405. v-model="month"
  406. type="month"
  407. value-format="YYYY-MM"
  408. placeholder="选择月份"
  409. class="!w-[140px]"
  410. @change="handleMonthChange"
  411. />
  412. </div>
  413. </el-form-item>
  414. </div>
  415. <!-- 区域和时间查询部分 -->
  416. <div class="flex flex-wrap items-start gap-x-2">
  417. <el-form-item label="区域" prop="equipDistrict">
  418. <AreaSelect
  419. v-model="equipQueryParams.equipDistrict"
  420. placeholder="请选择区域"
  421. class="!w-[240px]"
  422. multiple
  423. collapse-tags
  424. collapse-tags-tooltip
  425. :clearable="true"
  426. @clear="handleAreaClear"
  427. @change="handleAreaChange"
  428. />
  429. </el-form-item>
  430. <el-form-item label="街道" prop="equipStreet">
  431. <StreetSelect
  432. v-model="equipQueryParams.equipStreet"
  433. :district-ids="equipQueryParams.equipDistrict"
  434. placeholder="请选择街道"
  435. class="!w-[240px]"
  436. multiple
  437. collapse-tags
  438. collapse-tags-tooltip
  439. :clearable="true"
  440. @clear="handleStreetClear"
  441. @change="handleStreetChange"
  442. />
  443. </el-form-item>
  444. </div>
  445. <!-- 容器相关查询条件 -->
  446. <div class="">
  447. <el-form-item label="锅炉归类" prop="typeList" class="mb-2">
  448. <div class="flex items-center flex-1">
  449. <el-checkbox-group
  450. v-model="equipQueryParams.typeList"
  451. class="flex flex-wrap gap-2"
  452. >
  453. <el-checkbox
  454. v-for="dict in boilerTypeOptions"
  455. :key="dict.value"
  456. :label="dict.label"
  457. :value="dict.value"
  458. />
  459. </el-checkbox-group>
  460. </div>
  461. </el-form-item>
  462. </div>
  463. <!-- 操作按钮 -->
  464. <div class="flex justify-center">
  465. <el-form-item class="!mb-0">
  466. <el-button @click="handleEquipQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
  467. <el-button @click="resetEquipQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  468. <!-- 删除设备 -->
  469. <el-button type="danger" :disabled="selectedEquips.length === 0" @click="handleRejectEquip">
  470. <Icon icon="ep:failed" class="mr-5px" /> 拒绝约检
  471. </el-button>
  472. <el-button type="primary" @click="handleAddEquip"><Icon icon="ep:plus" class="mr-5px" /> 添加设备</el-button>
  473. <el-button type="primary" @click="handleBatchEditFn" :disabled="selectedEquips.length === 0">
  474. <Icon icon="ep:edit" class="mr-5px" /> 批量修改约检联系人
  475. </el-button>
  476. </el-form-item>
  477. </div>
  478. </el-form>
  479. </ContentWrap>
  480. <!-- 设备列表 -->
  481. <ContentWrap>
  482. <el-table
  483. v-loading="equipLoading"
  484. :data="equipList"
  485. stripe
  486. @selection-change="handleEquipSelectionChange"
  487. @sort-change="handleEquipSortChange"
  488. >
  489. <el-table-column type="selection" width="30" />
  490. <el-table-column label="区域" align="center" prop="equipDistrictName" sortable="custom" min-width="120" />
  491. <el-table-column label="街道" align="center" prop="equipStreetName" sortable="custom" min-width="120" />
  492. <el-table-column label="设备注册代码" align="center" prop="equipCode" min-width="190">
  493. <template #default="{ row }">
  494. {{ row.equipCode }}
  495. <dict-tag :type="DICT_TYPE.SYSTEM_EQUIP_BOILER_STATUS" :value="row.status" />
  496. </template>
  497. </el-table-column>
  498. <el-table-column label="是否租借" align="center" prop="isRent" min-width="80">
  499. <template #default="{ row }">
  500. {{ row.isRent ? '是' : '否' }}
  501. </template>
  502. </el-table-column>
  503. <el-table-column label="使用证编号" align="center" prop="useRegisterNo" min-width="120" />
  504. <el-table-column label="出厂编号" align="center" prop="factoryCode" min-width="120" />
  505. <el-table-column label="约检联系人" align="center" prop="contact" min-width="120" />
  506. <el-table-column label="约检联系人电话" align="center" prop="contactPhone" min-width="140" />
  507. <el-table-column label="蒸发量" align="center" prop="maxContinueEvapor" min-width="80" />
  508. <el-table-column label="型号" align="center" prop="boilerModel" min-width="120" />
  509. <!-- <el-table-column label="吨位" align="center" prop="tonnage" min-width="120" />-->
  510. </el-table>
  511. <!-- 分页 -->
  512. <Pagination
  513. :total="equipTotal"
  514. v-model:page="equipQueryParams.pageNo"
  515. v-model:limit="equipQueryParams.pageSize"
  516. @pagination="handleEquipQuery"
  517. />
  518. </ContentWrap>
  519. </ContentWrap>
  520. <!-- 添加设备弹窗 -->
  521. <AddEquipDialog
  522. v-model:visible="addEquipVisible"
  523. type=""
  524. :target-id="orderDetail?.id || ''"
  525. :unit-code="orderDetail?.unitCode || ''"
  526. :unit-name="orderDetail?.unitName || ''"
  527. @success="handleAddEquipSuccess"
  528. />
  529. <!-- 拒绝约检弹窗 -->
  530. <el-dialog
  531. v-model="rejectDialogVisible"
  532. title="拒绝约检"
  533. width="600px"
  534. destroy-on-close
  535. :close-on-click-modal="false"
  536. >
  537. <div class="mb-4">
  538. <div v-for="equip in selectedEquips" :key="equip.id" class="mb-2">
  539. 设备注册代码:{{ equip.equipCode }}
  540. </div>
  541. </div>
  542. <div class="mb-4">
  543. 检验性质:{{ orderDetail?.checkType ? allCheckTypeMap[orderDetail.equipMainType][orderDetail.checkType] : '' }}
  544. </div>
  545. <div class="mb-4 flex flex-start items-center">
  546. <div class="!w-80px">拒绝原因:</div>
  547. <el-select v-model="rejectForm.reasonDict" placeholder="请选择拒绝原因" @change="() => {rejectForm.reason = ''}">
  548. <el-option
  549. v-for="dict in getStrDictOptions('refuseInspectedCategory')"
  550. :key="dict.value"
  551. :label="dict.label"
  552. :value="dict.value"
  553. />
  554. </el-select>
  555. </div>
  556. <div class="mb-4" v-if="rejectForm.reasonDict == '5'">
  557. <div class="mb-2">说明:</div>
  558. <el-input
  559. v-model.trim="rejectForm.reason"
  560. type="textarea"
  561. :rows="4"
  562. placeholder="请输入"
  563. resize="none"
  564. :maxlength="100"
  565. show-word-limit
  566. />
  567. </div>
  568. <template #footer>
  569. <div class="flex justify-end items-center">
  570. <!-- <el-button type="primary" :loading="rejectLoading" @click="handleRejectConfirm(200)">上报拒检</el-button> -->
  571. <!-- <el-button v-if="orderDetail?.checkType === 100 || orderDetail?.checkType === 300" type="primary" :loading="rejectLoading" @click="handleRejectConfirm(100)">上报市局</el-button>-->
  572. <el-button type="primary" :loading="rejectLoading" @click="handleRejectConfirm(100)">上报市局</el-button>
  573. <!-- <el-button v-else type="primary" :loading="rejectLoading" @click="handleRejectConfirm(200)">上报拒检</el-button>-->
  574. <el-button type="warning" :loading="rejectLoading" @click="handleRejectConfirm(300)">无需上报</el-button>
  575. <el-button @click="rejectDialogVisible = false">取消</el-button>
  576. </div>
  577. </template>
  578. </el-dialog>
  579. <!-- 页面底部按钮 -->
  580. <div class="flex justify-center pb-4">
  581. <el-button @click="handleClose" :loading="loading">关闭</el-button>
  582. <el-button v-if="!route.query.id || orderDetail?.createAcceptOrder === false" type="primary" :loading="loading" @click="handleGenerateAcceptance">
  583. 生成受理单
  584. </el-button>
  585. <el-button type="primary" @click="handleSave" :loading="loading">保存</el-button>
  586. </div>
  587. <batchEditForm ref="batchEditFormRef" @success="()=>handleEquipQuery(true)"/>
  588. <EquipContainerForm ref="EquipContainerFormRef" />
  589. <FileUploadModal ref="fileUploadModalRef" @success="handleFileUploadSuccess" />
  590. </div>
  591. </template>
  592. <script setup lang="tsx">
  593. import { ref, onMounted, computed, watch, nextTick } from 'vue'
  594. import { useRoute, useRouter } from 'vue-router'
  595. import { ElMessage, ElMessageBox } from 'element-plus'
  596. import batchEditForm from '../planNew/components/batchEditForm.vue'
  597. import { BoilerAppointmentConfirmOrderApi, BoilerAppointmentConfirmOrderVO } from '@/api/pressure2/appointmentconfirmorder'
  598. import { EquipBoilerSchedulingEquipVO } from '@/api/pressure2/equipboilerscheduling'
  599. import dayjs from 'dayjs'
  600. import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
  601. import DeptSelect from '../../pressure2/equipboilerscheduling/components/DeptSelect.vue'
  602. import AreaSelect from '../../system/equipcontainer/components/AreaSelect.vue'
  603. import StreetSelect from '../../system/equipcontainer/components/StreetSelect.vue'
  604. import AddEquipDialog from '../schedule/components/AddEquipDialog.vue'
  605. import { formatArrayDate } from '@/utils/formatTime'
  606. import EquipContainerForm from '@/components/EquipContainerForm/index.vue'
  607. import { useTagsViewStore } from '@/store/modules/tagsView'
  608. import {
  609. PressureCheckTypeMap,
  610. PressureFeeTypeMap,
  611. PressureFeeNatureMap,
  612. PressureFeeNature,
  613. allCheckTypeMap
  614. } from '@/utils/constants'
  615. import { useEmitt } from '@/hooks/web/useEmitt'
  616. import { getUnitNewList, getUnitContacts } from '@/api/laboratory/unit'
  617. import { numberToChinese } from '@/utils/formatter'
  618. import FileUploadModal from './components/ImportFile.vue'
  619. import { buildFileUrl } from '@/utils'
  620. import { Icon } from '@/components/Icon'
  621. import { cloneDeep } from 'lodash-es'
  622. import { useUserStoreWithOut } from '@/store/modules/user'
  623. import CheckerSelect, { type CheckerItem } from '@/views/pressure2/components/CheckerSelect'
  624. const { emitter } = useEmitt()
  625. const route = useRoute()
  626. const router = useRouter()
  627. const tagsViewStore = useTagsViewStore()
  628. const userStore = useUserStoreWithOut()
  629. const batchEditFormRef = ref()
  630. const orderDetail = ref<BoilerAppointmentConfirmOrderVO>()
  631. const checkTypeMap = PressureCheckTypeMap
  632. const boilerTypeOptions = getStrDictOptions(DICT_TYPE.SYSTEM_EQUIP_BOILER_TYPE)
  633. const formData = ref<Record<string,any>>({
  634. checkType: '', //检验性质
  635. appointmentDate: '',
  636. teamList: [] as string[],
  637. unitName: {
  638. name: '',
  639. id: ''
  640. },
  641. deptName: '',
  642. equipDistrict: undefined as number | undefined,
  643. equipDistrictName: '',
  644. equipStreet: '',
  645. equipStreetName: '',
  646. unitContact: '',
  647. unitCode: '',
  648. unitContactDept: '',
  649. unitAddress: '',
  650. unitPhone: '',
  651. zipCode: '',
  652. mobile: '',
  653. remark: '',
  654. email: '',
  655. isAttach: false,
  656. sendType: '100',
  657. vehicle: '100',
  658. feeType: '100',
  659. acceptType: '100',
  660. actualAmount: 0,
  661. serviceAmount: 0,
  662. shouldAmount: 0,
  663. reduceFee: 0,
  664. planMaker: '',
  665. deptId: '',
  666. operator: '',
  667. areaDisplay: '',
  668. socialCreditCode: '',
  669. recipient: '',
  670. recipientPhone: '',
  671. recipientEmail: '',
  672. useUnitName: {
  673. name: '',
  674. id: ''
  675. },
  676. useUnitSocialCreditCode: '',
  677. useUnitAddress: '',
  678. useUnitZipcode: '',
  679. useUnitContact: '',
  680. useUnitPhone: '',
  681. deptPhone: '',
  682. feeNature: '',
  683. feeDate: 0,
  684. descritionFile: [],
  685. })
  686. const checkStatusMap = {
  687. '100': '内检',
  688. '200': '外检',
  689. '300': '耐压检',
  690. }
  691. const loading = ref(false)
  692. // 检验员选择相关
  693. const selectedCheckers = ref<CheckerItem[]>([])
  694. const checkerSelectRef = ref()
  695. const EquipContainerFormRef = ref<InstanceType<typeof EquipContainerForm>>()
  696. // 记录每个区域下已选择的街道
  697. const areaStreetMap = ref(new Map<number, number[]>())
  698. // 设备查询相关
  699. const equipQueryParams = ref({
  700. pageNo: 1,
  701. pageSize: 50,
  702. equipDistrict: undefined as number[] | undefined,
  703. equipStreet: undefined as number[] | undefined,
  704. equipCode: '',
  705. productNo: '',
  706. deptId: '',
  707. typeList: [] as string[],
  708. nextDate: [] as string[],
  709. useStatus: [] as string[],
  710. })
  711. const equipQueryFormRef = ref()
  712. const equipLoading = ref(false)
  713. const equipList = ref<EquipBoilerSchedulingEquipVO[]>([])
  714. // 选中的设备
  715. const selectedEquips = ref<EquipBoilerSchedulingEquipVO[]>([])
  716. const equipTotal = ref(0)
  717. const equipCategoryOptions = getStrDictOptions(DICT_TYPE.SYSTEM_EQUIP_CONTAINER_EQUIP_CATEGORY)
  718. const containerTypeOptions = getStrDictOptions(DICT_TYPE.SYSTEM_EQUIP_CONTAINER_EQUIP_TYPE)
  719. // 临检时间相关
  720. const datePickerType = ref<'daterange' | 'month'>('month')
  721. const daterange = ref<string[]>([])
  722. const month = ref<string>('')
  723. // 添加设备相关
  724. const addEquipVisible = ref(false)
  725. // 拒绝约检相关
  726. const rejectDialogVisible = ref(false)
  727. const rejectLoading = ref(false)
  728. const rejectForm = ref({
  729. reason: '',
  730. reasonDict: ''
  731. })
  732. const formRef = ref() // 表单引用
  733. /** 约检确认详情 */
  734. defineOptions({ name: 'OrderConfirmDetail' })
  735. // 表单验证规则
  736. const formRules = {
  737. // unitContact: [
  738. // { required: true, message: '请输入单位联系人', trigger: 'blur' }
  739. // ],
  740. // unitPhone: [
  741. // { required: true, message: '请输入单位联系电话', trigger: 'blur' },
  742. // ],
  743. // mobile: [
  744. // { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
  745. // ],
  746. email: [
  747. { pattern: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/, message: '请输入正确的邮箱', trigger: 'blur' }
  748. ],
  749. // unitPhone: [
  750. // { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
  751. // ],
  752. // recipientPhone: [
  753. // { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
  754. // ],
  755. recipientEmail: [
  756. { pattern: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/, message: '请输入正确的邮箱', trigger: 'blur' }
  757. ],
  758. payerContact: [
  759. { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
  760. ],
  761. payerMail: [
  762. { pattern: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/, message: '请输入正确的邮箱', trigger: 'blur' }
  763. ],
  764. sendType: [
  765. { required: true, message: '请选择送达方式', trigger: 'blur' }
  766. ],
  767. // feeType: [
  768. // { required: true, message: '请选择收费类型', trigger: 'blur' }
  769. // ],
  770. acceptType: [
  771. { required: true, message: '请选择受理方式', trigger: 'blur' }
  772. ],
  773. vehicle: [
  774. { required: true, message: '请选择交通工具', trigger: 'blur' }
  775. ],
  776. checkType: [
  777. { required: true, message: '请选择检验性质', trigger: 'blur' }
  778. ]
  779. }
  780. // 区域显示属性,与formData.areaDisplay分离
  781. const areaDisplay = computed(() => {
  782. const district = formData.value.equipDistrictName || ''
  783. const street = formData.value.equipStreetName || ''
  784. if (district && street) {
  785. return `${district}-${street}`
  786. }
  787. return district
  788. })
  789. // 获取约检详情
  790. const getDetail = async () => {
  791. const id = route.query?.id as string
  792. if (!id) return
  793. loading.value = true
  794. try {
  795. const res = await BoilerAppointmentConfirmOrderApi.getAppointmentConfirmOrder(id);
  796. let { unitCode, payerContact, payerContactName, payerMail, email } = res;
  797. orderDetail.value = res || {};
  798. // 更新表单数据
  799. formData.value = {
  800. ...formData.value,
  801. checkType: `${orderDetail.value?.checkType }`,
  802. appointmentDate: formatArrayDate(orderDetail.value?.appointmentDate || []),
  803. unitName: {
  804. name: orderDetail.value?.unitName || '',
  805. id: ''
  806. },
  807. useUnitName: {
  808. name: orderDetail.value?.useUnitName || '',
  809. id: ''
  810. },
  811. deptName: orderDetail.value?.deptName || '',
  812. equipDistrict: orderDetail.value?.equipDistrict ? Number(orderDetail.value.equipDistrict) : undefined,
  813. equipDistrictName: orderDetail.value?.equipDistrictName || '',
  814. unitContact: orderDetail.value?.unitContact || '',
  815. unitCode,
  816. unitAddress: orderDetail.value?.unitAddress || '',
  817. unitPhone: orderDetail.value?.unitPhone || '',
  818. zipCode: orderDetail.value?.zipCode || '',
  819. mobile: orderDetail.value?.mobile || '',
  820. remark: orderDetail.value?.remark || '',
  821. // email: orderDetail.value?.email || '',
  822. isAttach: orderDetail.value?.isAttach || false,
  823. sendType: String(orderDetail.value?.sendType || 100),
  824. vehicle: String(orderDetail.value?.vehicle || 100),
  825. feeType: String(orderDetail.value?.feeType || 100),
  826. acceptType: String(orderDetail.value?.acceptType || 100),
  827. actualAmount: orderDetail.value?.actualAmount || 0,
  828. serviceAmount: orderDetail.value?.serviceAmount || 0,
  829. shouldAmount: orderDetail.value?.shouldAmount || 0,
  830. reduceFee: orderDetail.value?.reduceFee || 0,
  831. deptId: orderDetail.value?.deptId || '',
  832. operator: orderDetail.value?.operator || '',
  833. equipStreetName: orderDetail.value?.equipStreetName || '',
  834. areaDisplay: areaDisplay.value,
  835. socialCreditCode: orderDetail.value?.socialCreditCode,
  836. recipient: orderDetail.value?.recipient,
  837. recipientPhone: orderDetail.value?.recipientPhone,
  838. recipientEmail: orderDetail.value?.recipientEmail,
  839. useUnitSocialCreditCode: orderDetail.value?.useUnitSocialCreditCode,
  840. useUnitAddress: orderDetail.value?.useUnitAddress,
  841. useUnitZipcode: orderDetail.value?.useUnitZipcode,
  842. useUnitContact: orderDetail.value?.useUnitContact,
  843. useUnitPhone: orderDetail.value?.useUnitPhone,
  844. deptPhone: orderDetail.value?.deptPhone,
  845. feeNature: `${orderDetail.value?.feeNature}`,
  846. feeDate: orderDetail.value?.feeDate || 0,
  847. payerContact,
  848. payerContactName,
  849. payerMail,
  850. email,
  851. status: orderDetail.value?.status || 100,
  852. }
  853. // 更新异常信息数据
  854. // 更新检验员数据
  855. const orderExceptionRespVO = res.orderExceptionRespVO
  856. if(orderExceptionRespVO){
  857. exceptionInfo.value = {
  858. ...orderExceptionRespVO,
  859. adjustEffectiveDate: orderExceptionRespVO.adjustEffectiveDate ? dayjs(orderExceptionRespVO.adjustEffectiveDate.join('-')).format('YYYY-MM-DD') : '',
  860. }
  861. }
  862. console.log(exceptionInfo.value, 'exceptionInfo')
  863. const teamList: CheckerItem[] = orderDetail.value?.teamList?.flatMap((team: any) => {
  864. const teamMembers: CheckerItem[] = []
  865. // 处理组长
  866. if (team.leaders && team.leaders.length > 0) {
  867. team.leaders.forEach((leader: any) => {
  868. if (leader) {
  869. teamMembers.push({
  870. groupTeamId: team.groupTeamId,
  871. memberId: leader.id,
  872. leaderId: leader.id,
  873. member: leader,
  874. isLeader: true
  875. })
  876. }
  877. })
  878. }
  879. // 处理组员
  880. if (team.members && team.members.length > 0) {
  881. team.members.forEach((member: any) => {
  882. if (member) {
  883. teamMembers.push({
  884. groupTeamId: team.groupTeamId,
  885. memberId: member.id,
  886. leaderId: team.leaders?.[0]?.id || '',
  887. member: member,
  888. isLeader: false
  889. })
  890. }
  891. })
  892. }
  893. return teamMembers
  894. }) || []
  895. if (teamList.length > 0) {
  896. selectedCheckers.value = teamList
  897. formData.value.teamList = teamList
  898. }
  899. // 加载检验员列表(默认当前登录人的部门)
  900. const deptId = userStore.getUser.deptId?.toString()
  901. if (deptId) {
  902. await nextTick()
  903. checkerSelectRef.value?.getCheckerList(deptId)
  904. }
  905. } catch (error) {
  906. console.error('获取计划详情失败:', error)
  907. ElMessage.error('获取计划详情失败')
  908. router.back()
  909. } finally {
  910. loading.value = false
  911. }
  912. }
  913. /** 处理检验员变化 */
  914. const handleCheckerChange = (checkers: CheckerItem[]) => {
  915. selectedCheckers.value = checkers
  916. // 同步更新 formData.value.teamList
  917. formData.value.teamList = checkers
  918. }
  919. /** 禁用日期 */
  920. const disabledDate = (time: Date) => {
  921. // 获取所有设备的最早检验日期
  922. const dates = equipList.value.map(item => {
  923. if (orderDetail.value?.checkType === 100) {
  924. return item.nextCheckDate ? formatArrayDate(item.nextCheckDate) : null
  925. } else if (orderDetail.value?.checkType === 200) {
  926. return item.nextYearCheckDate ? formatArrayDate(item.nextYearCheckDate) : null
  927. } else {
  928. return item.nextExpiredCheckDate ? formatArrayDate(item.nextExpiredCheckDate) : null
  929. }
  930. }).filter(Boolean) as any
  931. // 如果没有有效日期,则禁用过去的日期
  932. if (dates.length === 0) {
  933. return time.getTime() < dayjs().startOf('day').valueOf()
  934. }
  935. // 找到最早的检验日期
  936. const earliestDate = new Date(Math.min(...dates.map(date => new Date(date).getTime())))
  937. // 禁用早于最早检验日期的日期
  938. return time.getTime() > earliestDate.getTime()
  939. }
  940. // 设备查询相关
  941. const handleEquipQuery = async (isUpdateContact: boolean = false) => {
  942. loading.value = true
  943. try {
  944. const params = {
  945. pageNo: equipQueryParams.value.pageNo,
  946. pageSize: equipQueryParams.value.pageSize,
  947. orderId: orderDetail.value?.id,
  948. equipCode: equipQueryParams.value.equipCode,
  949. productNo: equipQueryParams.value.productNo,
  950. deptId: equipQueryParams.value.deptId,
  951. equipDistrict: equipQueryParams.value.equipDistrict,
  952. equipStreet: equipQueryParams.value.equipStreet,
  953. typeList: equipQueryParams.value.typeList || [],
  954. nextDate: equipQueryParams.value.nextDate || [],
  955. useStatus: equipQueryParams.value.useStatus || [],
  956. unitName: formData.value.useUnitName.name,
  957. }
  958. // 移除空值
  959. Object.keys(params).forEach(key => {
  960. if (params[key] === '' || params[key] === undefined || params[key] === null) {
  961. delete params[key]
  962. }
  963. // 处理空数组
  964. if (Array.isArray(params[key]) && params[key].length === 0) {
  965. delete params[key]
  966. }
  967. })
  968. // 调用后端API获取数据
  969. const res = await BoilerAppointmentConfirmOrderApi.getAppointmentConfirmOrderEquipmentList(params)
  970. equipList.value = res.list
  971. equipTotal.value = res.total
  972. // 批量修改约检联系人后,申请单位约检联系人与手机号,报告接收人与手机号同步修改。若使用单位与申请单位一致时,也需进行同步修改
  973. if(isUpdateContact && equipList.value.length > 0){
  974. const { contact, contactPhone } = equipList.value[0]
  975. formData.value.unitContact = contact
  976. formData.value.unitPhone = contactPhone
  977. formData.value.recipient = contact
  978. formData.value.recipientPhone = contactPhone
  979. if(formData.value.unitName.name === formData.value.useUnitName.name){
  980. formData.value.useUnitContact = contact
  981. formData.value.useUnitPhone = contactPhone
  982. }
  983. try {
  984. // 组装提交数据
  985. const submitData = {
  986. id: orderDetail.value?.id,
  987. unitContact: formData.value.unitContact,
  988. unitPhone: formData.value.unitPhone,
  989. recipient: formData.value.recipient,
  990. recipientPhone: formData.value.recipientPhone,
  991. useUnitContact: formData.value.useUnitContact,
  992. useUnitPhone: formData.value.useUnitPhone,
  993. }
  994. await BoilerAppointmentConfirmOrderApi.saveAcceptOrder(submitData)
  995. } catch (error) {
  996. ElMessage.error('提交失败')
  997. }
  998. }
  999. } finally {
  1000. loading.value = false
  1001. }
  1002. }
  1003. const handleEquipCodeFn = (id?: number) => {
  1004. EquipContainerFormRef.value.open(id)
  1005. }
  1006. const resetEquipQuery = () => {
  1007. // 重置查询参数
  1008. equipQueryParams.value = {
  1009. pageNo: 1,
  1010. pageSize: 50,
  1011. equipDistrict: undefined,
  1012. equipStreet: undefined,
  1013. equipCode: '',
  1014. productNo: '',
  1015. deptId: '',
  1016. typeList: [],
  1017. nextDate: [],
  1018. useStatus: [],
  1019. }
  1020. // 重置区域-街道映射
  1021. areaStreetMap.value.clear()
  1022. // 重置日期相关字段
  1023. daterange.value = []
  1024. month.value = ''
  1025. datePickerType.value = 'month'
  1026. // 重新查询数据
  1027. handleEquipQuery()
  1028. }
  1029. const handleEquipSelectionChange = (selection) => {
  1030. // 实现设备选择逻辑
  1031. selectedEquips.value = selection
  1032. }
  1033. const handleEquipSortChange = (sort) => {
  1034. // 实现设备排序逻辑
  1035. }
  1036. /** 处理区域变化 */
  1037. const handleAreaChange = (areas: number[]) => {
  1038. // 获取移除的区域(通过比较之前的区域列表和现在的区域列表)
  1039. const prevAreas = Array.from(areaStreetMap.value.keys())
  1040. const removedAreas = prevAreas.filter(area => !areas.includes(area))
  1041. // 移除取消选择的区域下的街道
  1042. if (removedAreas.length > 0) {
  1043. const currentStreets = equipQueryParams.value.equipStreet || []
  1044. removedAreas.forEach(areaId => {
  1045. const streetsToRemove = areaStreetMap.value.get(areaId) || []
  1046. // 从当前选中的街道中移除这些街道
  1047. equipQueryParams.value.equipStreet = currentStreets.filter(
  1048. streetId => !streetsToRemove.includes(streetId)
  1049. )
  1050. // 从映射中移除该区域
  1051. areaStreetMap.value.delete(areaId)
  1052. })
  1053. }
  1054. }
  1055. /** 处理区域清空 */
  1056. const handleAreaClear = () => {
  1057. // 清空所有选中的街道
  1058. equipQueryParams.value.equipStreet = []
  1059. // 清空区域-街道映射
  1060. areaStreetMap.value.clear()
  1061. }
  1062. /** 处理街道变化 */
  1063. const handleStreetChange = (streets: number[], areaId: number) => {
  1064. // 更新区域-街道映射
  1065. if (equipQueryParams.value.equipDistrict?.includes(areaId)) {
  1066. areaStreetMap.value.set(areaId, streets)
  1067. }
  1068. }
  1069. /** 处理街道清空 */
  1070. const handleStreetClear = () => {
  1071. // 清空所有区域下的街道选择
  1072. areaStreetMap.value.clear()
  1073. }
  1074. /** 处理日期范围变化 */
  1075. const handleDateChange = (val: [string, string] | null) => {
  1076. daterange.value = val || []
  1077. equipQueryParams.value.nextDate = val
  1078. ? [
  1079. dayjs(val[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss'),
  1080. dayjs(val[1]).endOf('day').format('YYYY-MM-DD HH:mm:ss')
  1081. ]
  1082. : []
  1083. }
  1084. /** 处理月份变化 */
  1085. const handleMonthChange = (val: string | null) => {
  1086. if (!val) {
  1087. equipQueryParams.value.nextDate = []
  1088. return
  1089. }
  1090. const date = dayjs(val)
  1091. equipQueryParams.value.nextDate = [
  1092. date.startOf('month').format('YYYY-MM-DD HH:mm:ss'),
  1093. date.endOf('month').format('YYYY-MM-DD HH:mm:ss')
  1094. ]
  1095. month.value = val
  1096. }
  1097. // 监听日期类型变化
  1098. watch(datePickerType, (newVal) => {
  1099. // 清空日期相关字段
  1100. daterange.value = []
  1101. month.value = ''
  1102. equipQueryParams.value.nextDate = []
  1103. })
  1104. /** 拒绝约检 */
  1105. const handleRejectEquip = async () => {
  1106. if (selectedEquips.value.length === 0) {
  1107. ElMessage.warning('请选择要拒绝约检的设备')
  1108. return
  1109. }
  1110. rejectForm.value.reasonDict = ''
  1111. rejectForm.value.reason = ''
  1112. rejectDialogVisible.value = true
  1113. }
  1114. /** 处理批量修改 */
  1115. const handleBatchEditFn = () => {
  1116. if (selectedEquips.value.length === 0) {
  1117. ElMessage.warning('请至少选择一条设备数据')
  1118. return
  1119. }
  1120. batchEditFormRef.value.open(selectedEquips.value, '1')
  1121. }
  1122. /** 确认拒绝约检 */
  1123. const handleRejectConfirm = async (type) => {
  1124. if (!rejectForm.value.reasonDict) {
  1125. ElMessage.warning('请选择拒绝原因')
  1126. return
  1127. }
  1128. if (rejectForm.value.reasonDict == '5' && !rejectForm.value.reason) {
  1129. ElMessage.warning('请输入说明')
  1130. return
  1131. }
  1132. const equipIds = selectedEquips.value.map(e => e.id)
  1133. const submitData = {
  1134. equipIds,
  1135. orderId: orderDetail.value?.id,
  1136. type,
  1137. reasonDict: rejectForm.value.reasonDict,
  1138. reason: rejectForm.value.reason,
  1139. orderNo: orderDetail.value?.appointmentNo,
  1140. checkType: orderDetail.value?.checkType
  1141. }
  1142. let alertText = ''
  1143. switch(type) {
  1144. case 100:
  1145. alertText = '上报市局'
  1146. break
  1147. case 200:
  1148. alertText = '拒绝约检'
  1149. break
  1150. case 300:
  1151. alertText = '无需上报'
  1152. break
  1153. default:
  1154. alertText = ''
  1155. }
  1156. rejectLoading.value = true
  1157. try {
  1158. // 调用api
  1159. const res = await BoilerAppointmentConfirmOrderApi.refuseAppointmentConfirmOrder(submitData)
  1160. ElMessage.success(alertText + '操作成功')
  1161. rejectLoading.value = false
  1162. // 提交成功后重置表单和关闭对话框
  1163. rejectForm.value.reason = ''
  1164. rejectForm.value.reasonDict = ''
  1165. rejectDialogVisible.value = false
  1166. handleEquipQuery() // 刷新设备列表
  1167. } catch (e) {
  1168. rejectLoading.value = false
  1169. ElMessage.error(alertText + '操作失败')
  1170. }
  1171. }
  1172. /** 添加设备 */
  1173. const handleAddEquip = () => {
  1174. addEquipVisible.value = true
  1175. }
  1176. /** 添加设备成功 */
  1177. const handleAddEquipSuccess = (selectedEquips) => {
  1178. ElMessage.success('添加设备成功')
  1179. // 更新设备列表
  1180. handleEquipQuery()
  1181. }
  1182. /** 生成受理单 */
  1183. const handleGenerateAcceptance = () => {
  1184. console.log('开始验证表单', formRef.value)
  1185. // 表单验证
  1186. if (!formRef.value) {
  1187. ElMessage.warning('表单引用获取失败')
  1188. return
  1189. }
  1190. // 手动触发表单验证
  1191. formRef.value.validate((valid, fields) => {
  1192. if (!valid) {
  1193. ElMessage.warning('请完善必填信息')
  1194. console.log('验证失败的字段:', fields)
  1195. return
  1196. }
  1197. // 检查排期时间和检验员
  1198. if (!formData.value.appointmentDate) {
  1199. ElMessage.warning('请选择约检时间')
  1200. return
  1201. }
  1202. if(!equipList.value.length){
  1203. ElMessage.warning('请添加设备')
  1204. return
  1205. }
  1206. // 二次确认
  1207. ElMessageBox.confirm(
  1208. '确认要生成受理单吗?提交后将无法修改。',
  1209. '操作确认',
  1210. {
  1211. confirmButtonText: '确认',
  1212. cancelButtonText: '取消',
  1213. type: 'warning'
  1214. }
  1215. ).then(async () => {
  1216. if(exceptionInfo.value.id){
  1217. await handleSaveException()
  1218. }
  1219. // 确认后提交
  1220. submitAcceptance()
  1221. }).catch(() => {
  1222. // 用户取消操作
  1223. console.log('用户取消操作')
  1224. })
  1225. })
  1226. }
  1227. /** 提交受理单 */
  1228. const submitAcceptance = async () => {
  1229. try {
  1230. let { unitCode='' } = formData.value;
  1231. loading.value = true
  1232. // 组装提交数据
  1233. const submitData: Record<string, any> = {
  1234. id: orderDetail.value?.id,
  1235. ...formData.value,
  1236. appointmentDate: formData.value.appointmentDate,
  1237. unitName: formData.value?.unitName?.name,
  1238. unitAddress: formData.value?.unitAddress,
  1239. unitCode,
  1240. unitContact: formData.value.unitContact,
  1241. unitContactDept: formData.value.unitContactDept,
  1242. unitPhone: formData.value.unitPhone,
  1243. equipDistrict: orderDetail.value?.equipDistrict,
  1244. equipStreet: orderDetail.value?.equipStreet,
  1245. zipCode: formData.value.zipCode,
  1246. checkType: orderDetail.value?.checkType,
  1247. equipType: orderDetail.value?.equipType,
  1248. equipMainType: orderDetail.value?.equipMainType,
  1249. deptId: orderDetail.value?.deptId,
  1250. email: formData.value.email,
  1251. mobile: formData.value.mobile,
  1252. remark: formData.value.remark,
  1253. isAttach: formData.value.isAttach,
  1254. sendType: formData.value.sendType,
  1255. vehicle: formData.value.vehicle,
  1256. feeType: formData.value.feeType,
  1257. acceptType: formData.value.acceptType,
  1258. actualAmount: formData.value.actualAmount,
  1259. serviceAmount: formData.value.serviceAmount,
  1260. shouldAmount: formData.value.shouldAmount,
  1261. reduceFee: formData.value.reduceFee,
  1262. useUnitName: formData.value?.useUnitName?.name,
  1263. teamList: selectedCheckers.value.reduce((acc, checker) => {
  1264. const existingTeam = acc.find(team => team.groupTeamId === checker.groupTeamId)
  1265. if (existingTeam) {
  1266. if (checker.isLeader) {
  1267. existingTeam.leaderId = checker.memberId
  1268. } else {
  1269. existingTeam.userIds.push(checker.memberId)
  1270. }
  1271. } else {
  1272. acc.push({
  1273. groupTeamId: checker.groupTeamId,
  1274. leaderId: checker.isLeader ? checker.memberId : '',
  1275. userIds: checker.isLeader ? [] : [checker.memberId]
  1276. })
  1277. }
  1278. return acc
  1279. }, []),
  1280. equipIds: equipList.value.map(e => e.id),
  1281. }
  1282. if(exceptionInfo.value.id){
  1283. submitData.boilerOrderExceptionSaveReqVO = cloneDeep({
  1284. ...exceptionInfo.value,
  1285. adjustEffectiveDate: unref(exceptionInfo).adjustEffectiveDate && unref(exceptionInfo).adjustEffectiveDate.split('-').map(item=>Number(item)),
  1286. })
  1287. }
  1288. // console.log('submitData:', submitData);
  1289. // 调用API提交受理单
  1290. await BoilerAppointmentConfirmOrderApi.submitAppointmentConfirmOrder(submitData);
  1291. emitter.emit('refresh-list')
  1292. ElMessage.success('受理单生成成功')
  1293. handleClose()
  1294. } catch (error) {
  1295. console.error('生成受理单失败:', error)
  1296. ElMessage.error('生成受理单失败')
  1297. } finally {
  1298. loading.value = false
  1299. }
  1300. }
  1301. /** 保存约检单 */
  1302. const handleSave = () => {
  1303. // console.log('开始验证表单', formRef.value)
  1304. // 表单验证
  1305. if (!formRef.value) return ElMessage.warning('表单引用获取失败')
  1306. // 手动触发表单验证
  1307. formRef.value.validate((valid, fields) => {
  1308. if (!valid) return ElMessage.warning('请完善必填信息')
  1309. // 检查排期时间
  1310. if (!formData.value.appointmentDate) return ElMessage.warning('请选择约检时间')
  1311. // 二次确认
  1312. ElMessageBox.confirm(
  1313. '确认保存吗?',
  1314. '操作确认',
  1315. {
  1316. confirmButtonText: '确认',
  1317. cancelButtonText: '取消',
  1318. type: 'warning'
  1319. }
  1320. ).then(async () => {
  1321. if(exceptionInfo.value.id){
  1322. await handleSaveException()
  1323. }
  1324. saveAcceptance()
  1325. })
  1326. })
  1327. }
  1328. const saveAcceptance = async () => {
  1329. try {
  1330. loading.value = true
  1331. // 组装提交数据
  1332. let submitData = {
  1333. id: orderDetail.value?.id,
  1334. ...formData.value,
  1335. equipType: orderDetail.value?.equipType,
  1336. equipNum: orderDetail.value?.equipNum,
  1337. unitName: orderDetail.value?.unitName?.name,
  1338. warningDay: orderDetail.value?.warningDay,
  1339. useUnitName: formData.value?.useUnitName?.name,
  1340. teamList: formData.value.teamList.reduce((acc: any[], item: any) => {
  1341. const existingGroup = acc.find(
  1342. group => group.groupTeamId === item.groupTeamId
  1343. );
  1344. if (existingGroup) {
  1345. // 避免重复添加相同的 userId,且不添加 leaderId
  1346. if (!item.isLeader && !existingGroup.userIds.includes(item.memberId)) {
  1347. existingGroup.userIds.push(item.memberId);
  1348. }
  1349. } else {
  1350. acc.push({
  1351. groupTeamId: item.groupTeamId,
  1352. leaderId: item.isLeader ? item.memberId : '',
  1353. userIds: item.isLeader ? [] : [item.memberId]
  1354. });
  1355. }
  1356. return acc;
  1357. }, [])
  1358. }
  1359. // 调用API保存
  1360. const res2 = await BoilerAppointmentConfirmOrderApi.saveAcceptOrder(submitData)
  1361. if(res2) {
  1362. ElMessage.success('保存成功')
  1363. handleClose()
  1364. }
  1365. } catch (error) {
  1366. ElMessage.error('保存失败')
  1367. } finally {
  1368. loading.value = false
  1369. }
  1370. }
  1371. // 手动输入单位
  1372. const useInputUseUnitName = ref(false)
  1373. const useInputUnitName = ref(false)
  1374. // 清空与单位相关字段的函数
  1375. const clearUnitFields = () => {
  1376. formData.value.unitName.name = ''
  1377. formData.value.socialCreditCode = ''
  1378. formData.value.unitAddress = ''
  1379. formData.value.unitContact = ''
  1380. formData.value.unitPhone = ''
  1381. formData.value.recipient = ''
  1382. formData.value.recipientPhone = ''
  1383. }
  1384. // 监听 useInputUnitName 变化
  1385. watch(useInputUnitName, (newValue) => {
  1386. if (newValue) {
  1387. clearUnitFields()
  1388. }
  1389. })
  1390. // 清空与使用单位相关的字段
  1391. const clearUseUnitFields = () => {
  1392. formData.value.useUnitName.name = ''
  1393. formData.value.useUnitSocialCreditCode = ''
  1394. formData.value.useUnitAddress = ''
  1395. formData.value.useUnitZipcode = ''
  1396. formData.value.useUnitContact = ''
  1397. formData.value.useUnitPhone = ''
  1398. }
  1399. // 监听 useInputUseUnitName 变化
  1400. watch(useInputUseUnitName, (newValue) => {
  1401. if (newValue) {
  1402. clearUseUnitFields()
  1403. }
  1404. })
  1405. // 申请单位名称 change
  1406. const handleChangeUnit = async (unitInfo:any) => {
  1407. formData.value.socialCreditCode = unitInfo.socialCreditCode;
  1408. formData.value.unitAddress = unitInfo.addr
  1409. formData.value.zipCode = unitInfo.post
  1410. if(orderDetail.value?.checkType != 200){
  1411. formData.value.feeNature = unitInfo.isExempt === '1' ? `${PressureFeeNature.SMZFC}` : `${PressureFeeNature.BSMZFC}`
  1412. }
  1413. // 获取单位默认联系人
  1414. const {list: unitDefaultContact} = await getUnitContacts({
  1415. pageNo: 1,
  1416. pageSize: 10,
  1417. unitId: unitInfo.id,
  1418. isDefault: '1'
  1419. })
  1420. if(unitDefaultContact && unitDefaultContact?.length > 0) {
  1421. formData.value.unitContact = unitDefaultContact[0].contactName
  1422. formData.value.unitPhone = unitDefaultContact[0].contactPhone
  1423. formData.value.recipient = unitDefaultContact[0].contactName
  1424. formData.value.recipientPhone = unitDefaultContact[0].contactPhone
  1425. }
  1426. }
  1427. // 使用单位名称 change
  1428. const handleChangeUseUnit = async (unitInfo:any) => {
  1429. console.log('使用单位名称 change:', unitInfo)
  1430. formData.value.useUnitSocialCreditCode = unitInfo.socialCreditCode;
  1431. formData.value.useUnitAddress = unitInfo.addr
  1432. formData.value.useUnitZipcode = unitInfo.post
  1433. // 获取单位默认联系人
  1434. const {list: unitDefaultContact} = await getUnitContacts({
  1435. pageNo: 1,
  1436. pageSize: 10,
  1437. unitId: unitInfo.id,
  1438. isDefault: '1'
  1439. })
  1440. if(unitDefaultContact && unitDefaultContact?.length > 0) {
  1441. formData.value.useUnitContact = unitDefaultContact[0].contactName
  1442. formData.value.useUnitPhone = unitDefaultContact[0].contactPhone
  1443. }
  1444. await handleEquipQuery()
  1445. }
  1446. // 使用单位名称input框失焦 & 回车按钮进行查询
  1447. const handleChangeUseUnitInput = () => {
  1448. handleEquipQuery()
  1449. }
  1450. /** 关闭 */
  1451. const handleClose = () => {
  1452. tagsViewStore.closeSelectedTag(route)
  1453. router.push({
  1454. name: 'OrderConfirm',
  1455. })
  1456. }
  1457. // 监听表单区域相关字段变化,更新areaDisplay
  1458. watch([() => formData.value.equipDistrictName, () => formData.value.equipStreetName], () => {
  1459. formData.value.areaDisplay = areaDisplay.value
  1460. })
  1461. const exceptionInfo = ref<Record<string, any>>({})
  1462. const getExceptionItem = (field: string, fieldAttr: string)=>{
  1463. const fileUrl = exceptionInfo.value[fieldAttr] && buildFileUrl(exceptionInfo.value[fieldAttr])
  1464. const fileName = exceptionInfo.value[field]
  1465. if(fileUrl) {
  1466. return (
  1467. <>
  1468. <div class="flex items-center w-full p-l-10px p-r-10px hover:bg-gray-100 rounded-6px">
  1469. {/* <el-tooltip content={fileName}> */}
  1470. <span class="flex-1 text-ellipsis overflow-hidden whitespace-nowrap">{fileName}</span>
  1471. {/* </el-tooltip> */}
  1472. <div class="ml-10px">
  1473. <el-link href={fileUrl} underline={false} download target="_blank" type="primary">下载</el-link>
  1474. </div>
  1475. <div class="ml-10px">
  1476. <el-button link type="danger" onClick={()=>handleRemove(field, fieldAttr)}>删除</el-button>
  1477. </div>
  1478. </div>
  1479. </>
  1480. )
  1481. } else {
  1482. return (
  1483. <el-button type="primary" onClick={()=>handleOpenFileUploadModal(field, fieldAttr)}>
  1484. <Icon icon="ep:upload-filled" />
  1485. <span>附件上传</span>
  1486. </el-button>
  1487. )
  1488. }
  1489. }
  1490. const addExceptionInfo = () => {
  1491. const orderId = formData.value.id || route.query?.id;
  1492. if(!orderId) {
  1493. // ElMessage.error('请先保存订单')
  1494. return
  1495. }
  1496. BoilerAppointmentConfirmOrderApi.createExceptionInfo({
  1497. orderId: formData.value.id || route.query?.id,
  1498. orderType: 100,
  1499. }).then((res) => {
  1500. if(res) {
  1501. ElMessage.success('生成成功')
  1502. handleGetExceptionInfo(res)
  1503. }
  1504. }).catch((error)=>{
  1505. ElMessage.error(error)
  1506. })
  1507. }
  1508. const deleteExceptionInfo = () => {
  1509. ElMessageBox.confirm('确定删除异常单吗?', '提示', {
  1510. confirmButtonText: '确定',
  1511. cancelButtonText: '取消',
  1512. type: 'warning',
  1513. }).then(() => {
  1514. BoilerAppointmentConfirmOrderApi.deleteExceptionInfo(exceptionInfo.value.id).then(res=>{
  1515. if(res) {
  1516. ElMessage.success('删除成功')
  1517. exceptionInfo.value = {}
  1518. }
  1519. })
  1520. }).catch(() => {
  1521. // 取消删除
  1522. });
  1523. }
  1524. // 更新异常信息
  1525. const handleSaveException=()=>{
  1526. return new Promise((resolve, reject)=>{
  1527. const { adjustEffectiveDate } = unref(exceptionInfo)
  1528. const params = {
  1529. ...exceptionInfo.value,
  1530. adjustEffectiveDate: adjustEffectiveDate && adjustEffectiveDate.split('-').map(item=>Number(item)),
  1531. }
  1532. BoilerAppointmentConfirmOrderApi.updateExceptionInfo(params).then(res=>{
  1533. resolve(res)
  1534. }).catch((error)=>{
  1535. reject(error)
  1536. })
  1537. })
  1538. }
  1539. const getExceptionInfoList = () => {
  1540. BoilerAppointmentConfirmOrderApi.getExceptionInfoList({
  1541. orderId: formData.value.id || route.query?.id,
  1542. }).then(res=>{
  1543. console.log('getExceptionInfoList:',res)
  1544. })
  1545. }
  1546. const handleGetExceptionInfo = (id: string) => {
  1547. BoilerAppointmentConfirmOrderApi.getExceptionInfo(id).then((res) => {
  1548. if(res) exceptionInfo.value = {
  1549. ...res,
  1550. adjustEffectiveDate: res.adjustEffectiveDate?.join('-')
  1551. }
  1552. }).catch((error)=>{
  1553. console.log(error, '-----error--->')
  1554. ElMessage.error(error)
  1555. })
  1556. }
  1557. const fileUploadModalRef = ref<InstanceType<typeof FileUploadModal>>();
  1558. const currentUploadMap = reactive({
  1559. field: '',
  1560. fieldAttr: '',
  1561. })
  1562. const handleOpenFileUploadModal = (type: string, attach: string) => {
  1563. currentUploadMap.field = type
  1564. currentUploadMap.fieldAttr = attach
  1565. fileUploadModalRef.value?.open()
  1566. }
  1567. const handleFileUploadSuccess = (fileInfo:{fileName: string, fileUrl: string}) => {
  1568. exceptionInfo.value[currentUploadMap.field] = fileInfo.fileName
  1569. exceptionInfo.value[currentUploadMap.fieldAttr] = fileInfo.fileUrl
  1570. console.log('handleFileUploadSuccess:', exceptionInfo.value)
  1571. }
  1572. const handleRemove = (type: string, attach: string) => {
  1573. exceptionInfo.value[type] = ''
  1574. exceptionInfo.value[attach] = ''
  1575. }
  1576. // 页面加载时获取详情
  1577. onMounted(async () => {
  1578. await getDetail()
  1579. if(route.query?.id) {
  1580. await handleEquipQuery()
  1581. // await handleGetExceptionInfo('eb9a57fe2ed98a45e1a892aef4cc13f0')
  1582. }
  1583. })
  1584. </script>
  1585. <style lang="scss" scoped>
  1586. .form-group {
  1587. &:not(:last-child) {
  1588. margin-bottom: 16px;
  1589. }
  1590. &-title {
  1591. color: #606266;
  1592. font-size: 13px;
  1593. font-weight: 500;
  1594. margin-bottom: 0;
  1595. }
  1596. }
  1597. .p-3 {
  1598. padding-top: 0;
  1599. }
  1600. .check-info-label-title {
  1601. width: 100%;
  1602. line-height: 32px;
  1603. display: flex;
  1604. align-items: center;
  1605. margin-bottom: 12px;
  1606. &::before {
  1607. content: '';
  1608. display: inline-block;
  1609. width: 4px;
  1610. height: 16px;
  1611. background: var(--el-color-primary);
  1612. margin-right: 8px;
  1613. }
  1614. }
  1615. .feeDate_box {
  1616. color: #606266;
  1617. :deep(.el-input-number) {
  1618. width: 120px !important;
  1619. }
  1620. }
  1621. .unit-form-item {
  1622. :deep(.el-form-item__content) {
  1623. display: flex;
  1624. align-items: center;
  1625. flex-wrap: nowrap;
  1626. .el-button {
  1627. margin-left: 8px;
  1628. }
  1629. }
  1630. }
  1631. .unit-name {
  1632. display: flex;
  1633. align-items: center;
  1634. padding: 0 0 8px;
  1635. .label {
  1636. width: 90px;
  1637. color: #606266;
  1638. font-size: 13px;
  1639. text-align: right;
  1640. padding-right: 12px;
  1641. }
  1642. .value {
  1643. flex: 1;
  1644. font-size: 14px;
  1645. color: #303133;
  1646. }
  1647. }
  1648. :deep(.el-form) {
  1649. .el-form-item {
  1650. margin-bottom: 12px;
  1651. align-items: center;
  1652. &__label {
  1653. height: auto;
  1654. font-size: 13px;
  1655. line-height: 20px;
  1656. color: #606266;
  1657. padding-right: 8px;
  1658. }
  1659. .el-date-editor.el-input, .el-input-number {
  1660. width: 100%;
  1661. .el-input__inner {
  1662. text-align: left;
  1663. }
  1664. }
  1665. &.actualAmountFormItem {
  1666. .el-form-item__content {
  1667. display: flex;
  1668. .el-input-number {
  1669. width: 300px;
  1670. }
  1671. }
  1672. }
  1673. }
  1674. }
  1675. .reject-dialog {
  1676. :deep(.el-dialog__header) {
  1677. margin: 0;
  1678. padding: 16px 20px;
  1679. border-bottom: 1px solid #dcdfe6;
  1680. }
  1681. :deep(.el-dialog__body) {
  1682. padding: 20px;
  1683. }
  1684. .reject-content {
  1685. .equip-list {
  1686. margin-bottom: 20px;
  1687. color: #606266;
  1688. line-height: 1.6;
  1689. }
  1690. .check-type {
  1691. color: #606266;
  1692. }
  1693. .reject-reason {
  1694. .reason-label {
  1695. color: #606266;
  1696. }
  1697. :deep(.el-textarea__inner) {
  1698. background-color: #f5f7fa;
  1699. border-color: #e4e7ed;
  1700. &:focus {
  1701. background-color: #fff;
  1702. }
  1703. }
  1704. }
  1705. }
  1706. .reject-footer {
  1707. margin-top: 20px;
  1708. display: flex;
  1709. align-items: center;
  1710. justify-content: space-between;
  1711. .time-tag {
  1712. :deep(.el-tag) {
  1713. height: 32px;
  1714. line-height: 30px;
  1715. font-size: 16px;
  1716. padding: 0 12px;
  1717. }
  1718. }
  1719. .action-buttons {
  1720. .el-button + .el-button {
  1721. margin-left: 12px;
  1722. }
  1723. }
  1724. }
  1725. }
  1726. </style>