todoDetail.vue 114 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587
  1. <template>
  2. <div class="app-container">
  3. <el-collapse v-model="activeName" @change="handleChange" accordion>
  4. <el-collapse-item name="workflowBoard">
  5. <template slot="title">
  6. <span style="font-size:20px; margin-left:20px;letter-spacing:2px;color:red">
  7. <i class="el-icon-warning"></i>
  8. <span> 当前节点:{{ currentNode == null ? '???' : currentNode.nodeName }}</span>
  9. <span> 项目编号:{{ nodeBusinessInfo.businessSubId }}</span>
  10. </span>
  11. <span style="font-size:15px; margin-left:15px;letter-spacing:2px; color:RGB(168,168,168)">
  12. 点击展开查看实时流程图
  13. </span>
  14. </template>
  15. <WorkflowBoard ref='board' @workflowCommitVerify="workflowCommitVerify" :nodeBusinessInfo="nodeBusinessInfo" />
  16. </el-collapse-item>
  17. </el-collapse>
  18. <div class="button-area">
  19. <el-button v-if="nodeBusinessInfo.currentNodePermission.commit" class="y-save" type="success" round
  20. @click="commit('PASS')" :disabled="!nodeBusinessInfo.doWorkflow">提交</el-button>
  21. <el-button v-if="nodeBusinessInfo.currentNodePermission.reversible" class="y-save" type="warning" round
  22. @click="commit('REVERSE')" :disabled="!nodeBusinessInfo.doWorkflow">退回</el-button>
  23. <el-button v-if="nodeBusinessInfo.currentNodePermission.skippable" class="y-save" type="warning" round
  24. @click="commit('SKIP')" :disabled="!nodeBusinessInfo.doWorkflow">跳过</el-button>
  25. <el-button v-if="nodeBusinessInfo.currentNodePermission.terminable" class="y-save" type="danger" round
  26. @click="commit('TERMINATE')" :disabled="!nodeBusinessInfo.doWorkflow">终止</el-button>
  27. <el-button v-if="nodeBusinessInfo.currentNodePermission.restartable" class="y-save" type="danger" round
  28. @click="commit('RESTART')" :disabled="!nodeBusinessInfo.doWorkflow">重置</el-button>
  29. <el-button class="y-save" round type="info" @click="goBack">返回</el-button>
  30. </div>
  31. <el-tabs v-model="activeTagName" @tab-click="handleClick" type="border-card">
  32. <el-tab-pane name="order" class="pane-class" :lazy=true>
  33. <span slot="label"><i class="el-icon-document"></i> 个贷订单</span>
  34. <el-form ref="personalForm" :model="personal">
  35. <div class="createMajor-main-container">
  36. <div class="postInfo-container">
  37. <div>
  38. <el-divider content-position="left">
  39. <h3 class="title">
  40. <div class="avatar-wrapper icon-title">订单</div>
  41. <div class="icon-info">个贷订单</div>
  42. </h3>
  43. </el-divider>
  44. </div>
  45. <el-row class="row-style">
  46. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  47. <el-form-item label="项目编号:" prop="orderId" label-width="120px" class="postInfo-container-item">
  48. <el-input :value="personal.orderId" class="filter-item" readonly disabled/>
  49. </el-form-item>
  50. </el-col>
  51. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  52. <el-form-item label="评估目的:" prop="evaluateAim" label-width="120px" class="postInfo-container-item">
  53. <el-input :value="personal.evaluateAim" class="filter-item" readonly disabled/>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :xs="24" :sm="12" :lg="12" :span="6">
  57. <el-form-item label="房屋用途:" prop="purpose" label-width="160px" class="postInfo-container-item">
  58. <el-checkbox-group v-model="personal.purpose">
  59. <el-checkbox-button label="HOUSE" name="purpose">住宅</el-checkbox-button>
  60. <el-checkbox-button label="BUSINESS" name="purpose">商业</el-checkbox-button>
  61. <el-checkbox-button label="OFFICE" name="purpose">办公</el-checkbox-button>
  62. <el-checkbox-button label="INDUSTRIAL" name="purpose">工业</el-checkbox-button>
  63. <el-checkbox-button label="OTHER" name="purpose">其他</el-checkbox-button>
  64. </el-checkbox-group>
  65. </el-form-item>
  66. </el-col>
  67. </el-row>
  68. <el-row class="row-style">
  69. <el-col :xs="12" :sm="12" :lg="24" :span="6">
  70. <el-form-item label="坐落:" prop="location" label-width="120px" class="postInfo-container-item">
  71. <el-input :value="personal.location" class="filter-item" readonly disabled/>
  72. </el-form-item>
  73. </el-col>
  74. </el-row>
  75. <el-row class="row-style">
  76. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  77. <el-form-item label="客户类型:" prop="clienteleType" label-width="120px" class="postInfo-container-item">
  78. <el-input :value="personal.clienteleType" class="filter-item" readonly disabled/>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  82. <el-form-item label="客户名称:" prop="clienteleId" label-width="120px" class="postInfo-container-item">
  83. <el-input :value="personal.clientName" class="filter-item" readonly disabled/>
  84. </el-form-item>
  85. </el-col>
  86. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  87. <el-form-item label="业务来源:" prop="clienteleSubId" label-width="120px" class="postInfo-container-item">
  88. <el-input :value="personal.clientSubName" class="filter-item" readonly disabled/>
  89. </el-form-item>
  90. </el-col>
  91. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  92. <el-form-item label="客户联系人:" prop="clienteleContactId" label-width="120px"
  93. class="postInfo-container-item">
  94. <el-input :value="personal.contactName" class="filter-item" readonly disabled/>
  95. </el-form-item>
  96. </el-col>
  97. </el-row>
  98. <el-row class="row-style">
  99. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  100. <el-form-item label="联系人电话:" prop="clienteleContactId" label-width="120px"
  101. class="postInfo-container-item">
  102. <el-input :value="personal.contactTel" class="filter-item" readonly disabled/>
  103. </el-form-item>
  104. </el-col>
  105. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  106. <el-form-item label="联系人部门:" prop="clienteleContactId" label-width="120px"
  107. class="postInfo-container-item">
  108. <el-input :value="personal.cdepartment" class="filter-item" readonly disabled/>
  109. </el-form-item>
  110. </el-col>
  111. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  112. <el-form-item label="联系人职务:" prop="clienteleContactId" label-width="120px"
  113. class="postInfo-container-item">
  114. <el-input :value="personal.cduty" class="filter-item" readonly disabled/>
  115. </el-form-item>
  116. </el-col>
  117. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  118. <el-form-item label="中介:" prop="agent" label-width="120px" class="postInfo-container-item">
  119. <el-input :value="personal.agent" class="filter-item" readonly disabled/>
  120. </el-form-item>
  121. </el-col>
  122. </el-row>
  123. <el-row class="row-style">
  124. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  125. <el-form-item label="贷款性质:" prop="loanNature" label-width="120px" class="postInfo-container-item">
  126. <el-input :value="personal.loanNature" class="filter-item" readonly disabled/>
  127. </el-form-item>
  128. </el-col>
  129. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  130. <el-form-item label="贷款用途:" prop="loanAim" label-width="120px" class="postInfo-container-item">
  131. <el-input :value="personal.loanAim" class="filter-item" readonly disabled/>
  132. </el-form-item>
  133. </el-col>
  134. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  135. <el-form-item label="贷款额度:" prop="loanLimit" label-width="120px" class="postInfo-container-item">
  136. <el-input :value="personal.loanLimit" class="filter-item" readonly disabled>
  137. <template slot="append">万元</template>
  138. </el-input>
  139. </el-form-item>
  140. </el-col>
  141. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  142. <el-form-item label="贷款期限:" prop="loanPeriod" label-width="120px" class="postInfo-container-item">
  143. <el-input :value="personal.loanPeriod" class="filter-item" readonly disabled>
  144. <template slot="append">年</template>
  145. </el-input>
  146. </el-form-item>
  147. </el-col>
  148. </el-row>
  149. <el-row class="row-style">
  150. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  151. <el-form-item label="贷款是否到期:" prop="loanExpire" label-width="140px" class="postInfo-container-item">
  152. <el-radio v-model="personal.loanExpire" :label="false" border>否</el-radio>
  153. <el-radio v-model="personal.loanExpire" :label="true" border>是</el-radio>
  154. </el-form-item>
  155. </el-col>
  156. <el-col :xs="24" :sm="12" :lg="12" :span="6">
  157. <el-form-item label="资料说明:" prop="credentials" label-width="120px" class="postInfo-container-item">
  158. <el-checkbox-group v-model="personal.credentials">
  159. <el-checkbox-button label="HOUSE_CERTIFICATE" name="credentials">房产证</el-checkbox-button>
  160. <el-checkbox-button label="LAND_CERTIFICATE" name="credentials">国土证</el-checkbox-button>
  161. <el-checkbox-button label="IMMOVABLE_CERTIFICATE" name="credentials">不动产权证</el-checkbox-button>
  162. <el-checkbox-button label="NONE" name="credentials">无资料</el-checkbox-button>
  163. </el-checkbox-group>
  164. </el-form-item>
  165. </el-col>
  166. </el-row>
  167. <el-row class="row-style">
  168. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  169. <el-form-item label="委托人1:" prop="bailorA" label-width="120px" class="postInfo-container-item">
  170. <el-input :value="personal.bailorA" class="filter-item" readonly disabled />
  171. </el-form-item>
  172. </el-col>
  173. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  174. <el-form-item label="委托人1电话:" prop="bailorATel" label-width="120px" class="postInfo-container-item">
  175. <el-input :value="personal.bailorATel" class="filter-item" readonly disabled/>
  176. </el-form-item>
  177. </el-col>
  178. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  179. <el-form-item label="委托人2:" prop="bailorB" label-width="120px" class="postInfo-container-item">
  180. <el-input :value="personal.bailorB" class="filter-item" readonly disabled/>
  181. </el-form-item>
  182. </el-col>
  183. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  184. <el-form-item label="委托人2电话:" prop="bailorBTel" label-width="120px" class="postInfo-container-item">
  185. <el-input :value="personal.bailorBTel" class="filter-item" readonly disabled />
  186. </el-form-item>
  187. </el-col>
  188. </el-row>
  189. <el-row class="row-style">
  190. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  191. <el-form-item label="终端客户类型:" prop="terminalClienteleType" label-width="140px"
  192. class="postInfo-container-item">
  193. <el-input :value="personal.terminalClienteleType" class="filter-item" readonly disabled />
  194. </el-form-item>
  195. </el-col>
  196. <el-col :xs="24" :sm="12" :lg="12" :span="6" v-show="personal.terminalClienteleType!=''">
  197. <el-form-item label="终端客户名称:" prop="terminalClienteleId" label-width="140px"
  198. class="postInfo-container-item">
  199. <el-input :value="personal.tterminalClienteleName" class="filter-item" readonly disabled />
  200. </el-form-item>
  201. </el-col>
  202. <el-col :xs="24" :sm="12" :lg="6" :span="6" v-show="personal.terminalClienteleType=='企业'">
  203. <el-form-item label="终端联系人:" prop="terminalClienteleContactId" label-width="120px"
  204. class="postInfo-container-item">
  205. <el-input :value="personal.tterminalClienteleContactName" class="filter-item"
  206. readonly disabled />
  207. </el-form-item>
  208. </el-col>
  209. <el-col :xs="24" :sm="12" :lg="6" :span="6" v-show="personal.terminalClienteleType!=''">
  210. <el-form-item label="终端联系电话:" prop="clienteleType" label-width="140px"
  211. class="postInfo-container-item">
  212. <el-input :value="personal.tmobile" class="filter-item" readonly disabled />
  213. </el-form-item>
  214. </el-col>
  215. </el-row>
  216. <el-row class="row-style">
  217. <el-col :xs="24" :sm="12" :lg="23" :span="12">
  218. <el-form-item label="订单备注:" prop="remark" label-width="120px" class="postInfo-container-item">
  219. <el-input :value="personal.remark" class="filter-item" type="text" readonly disabled />
  220. </el-form-item>
  221. </el-col>
  222. </el-row>
  223. </div>
  224. </div>
  225. </el-form>
  226. <el-form ref="personalMemberForm" :model="personal" :rules="rules">
  227. <div class="createMajor-main-container">
  228. <div class="postInfo-container">
  229. <div>
  230. <el-divider content-position="left">
  231. <h3 class="title">
  232. <div class="avatar-wrapper icon-title">人员</div>
  233. <div class="icon-info">项目人员</div>
  234. </h3>
  235. </el-divider>
  236. </div>
  237. <el-row class="row-style">
  238. <el-col :xs="24" :sm="12" :lg="5" :span="6">
  239. <el-form-item label="客户经理:" prop="clientManager" label-width="120px" class="postInfo-container-item">
  240. <el-input :value="personal.clientManager" class="filter-item" readonly disabled
  241. />
  242. </el-form-item>
  243. </el-col>
  244. <el-col :xs="24" :sm="12" :lg="5" :span="6">
  245. <el-form-item label="内业人员:" prop="inwardStaffName" label-width="120px" class="postInfo-container-item">
  246. <el-input :value="personal.inwardStaffName" class="filter-item" readonly disabled
  247. />
  248. </el-form-item>
  249. </el-col>
  250. <el-col :xs="24" :sm="12" :lg="5" :span="6">
  251. <el-form-item label="外业人员:" prop="outwardStaff" label-width="120px" class="postInfo-container-item">
  252. <el-tooltip v-if="currentNode.nodeCode === 'DEPARTMENT_ALLOCATION'" placement="top-start"
  253. content="请确定外业人员" :manual=true v-model="outwardStaffTip">
  254. <el-select v-model="personal.outwardStaff" filterable clearable>
  255. <el-option v-for="(item, id) in outwardStaffs" :key="item.id" :label="item.name" :value="item.id">
  256. </el-option>
  257. </el-select>
  258. </el-tooltip>
  259. <el-input :value="personal.outwardStaffName" class="filter-item" readonly disabled
  260. v-else />
  261. </el-form-item>
  262. </el-col>
  263. <el-col :xs="24" :sm="12" :lg="5" :span="6">
  264. <el-form-item label="定价内业:" prop="pricingStaffName" label-width="120px" class="postInfo-container-item">
  265. <el-input :value="personal.pricingStaffName" class="filter-item" readonly disabled
  266. />
  267. </el-form-item>
  268. </el-col>
  269. <el-col :xs="24" :sm="12" :lg="4" :span="6">
  270. <el-form-item label-width="160px">
  271. <el-button v-if="currentNode.nodeCode === 'DEPARTMENT_ALLOCATION'" type="primary" round
  272. @click="saveOutwardStaff()">保存</el-button>
  273. </el-form-item>
  274. </el-col>
  275. </el-row>
  276. </div>
  277. </div>
  278. </el-form>
  279. </el-tab-pane>
  280. <el-tab-pane name="scene" class="pane-class" :lazy=true>
  281. <span slot="label"><i class="el-icon-search"></i> 外业实勘</span>
  282. <el-form ref="sceneForm" :model="sceneForm" class="form-container" :rules="rules">
  283. <div class="createMajor-main-container">
  284. <div class="postInfo-container">
  285. <div>
  286. <el-divider content-position="left">
  287. <h3 class="title">
  288. <div class="avatar-wrapper icon-title">实勘</div>
  289. <div class="icon-info">实勘信息</div>
  290. </h3>
  291. </el-divider>
  292. </div>
  293. <div >
  294. <el-row class="row-style" v-if="currentNode.nodeCode === 'SPOT_RECONNAISSANCE'">
  295. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  296. <el-button type="danger" round @click="saveScene()">保存</el-button>
  297. </el-col>
  298. </el-row>
  299. <el-row class="row-style" style="margin-top: 10px;">
  300. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  301. <el-form-item prop="orderId" label-width="120px" class="postInfo-container-item" label="订单号:">
  302. <el-input disabled readonly :value="personal.orderId"
  303. class="filter-item" />
  304. </el-form-item>
  305. </el-col>
  306. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  307. <el-form-item prop="sceneUserName" label-width="120px" class="postInfo-container-item" label="实勘人:">
  308. <el-input disabled readonly :value="personal.outwardStaffName"
  309. class="filter-item" />
  310. </el-form-item>
  311. </el-col>
  312. <el-col :xs="24" :sm="12" :lg="12" :span="6">
  313. <el-form-item prop="productionType" label-width="120px" class="postInfo-container-item"
  314. label="坐落:">
  315. <el-input disabled readonly :value="personal.location"
  316. class="filter-item" />
  317. </el-form-item>
  318. </el-col>
  319. </el-row>
  320. <el-row class="row-style">
  321. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  322. <el-form-item prop="inRingDewlling" label-width="120px" class="postInfo-container-item"
  323. :rules="{ required: true, message: '绕城内住宅不能为空', trigger: 'blur' }"
  324. label="绕城内住宅:">
  325. <el-input-number style="width: 100%;" :min="0" v-model="sceneForm.inRingDewlling" :readonly="currentNode.nodeCode != 'SPOT_RECONNAISSANCE'"
  326. :disabled="currentNode.nodeCode != 'SPOT_RECONNAISSANCE'"
  327. class="filter-item">
  328. </el-input-number>
  329. </el-form-item>
  330. </el-col>
  331. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  332. <el-form-item prop="outRingDewlling" label-width="120px" class="postInfo-container-item"
  333. :rules="{ required: true, message: '绕城外住宅不能为空', trigger: 'blur' }"
  334. label="绕城外住宅:">
  335. <el-input-number style="width: 100%;" :min="0" v-model="sceneForm.outRingDewlling" :readonly="currentNode.nodeCode != 'SPOT_RECONNAISSANCE'"
  336. :disabled="currentNode.nodeCode != 'SPOT_RECONNAISSANCE'"
  337. class="filter-item">
  338. </el-input-number>
  339. </el-form-item>
  340. </el-col>
  341. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  342. <el-form-item prop="inRingBuilding" label-width="120px" class="postInfo-container-item"
  343. :rules="{ required: true, message: '绕城内商业不能为空', trigger: 'blur' }"
  344. label="绕城内商业:">
  345. <el-input-number style="width: 100%;" :min="0" v-model="sceneForm.inRingBuilding" :readonly="currentNode.nodeCode != 'SPOT_RECONNAISSANCE'"
  346. :disabled="currentNode.nodeCode != 'SPOT_RECONNAISSANCE'"
  347. class="filter-item">
  348. </el-input-number>
  349. </el-form-item>
  350. </el-col>
  351. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  352. <el-form-item prop="outRingBuilding" label-width="120px" class="postInfo-container-item"
  353. :rules="{ required: true, message: '绕城外商业不能为空', trigger: 'blur' }"
  354. label="绕城外商业:">
  355. <el-input-number style="width: 100%;" :min="0" v-model="sceneForm.outRingBuilding" :readonly="currentNode.nodeCode != 'SPOT_RECONNAISSANCE'"
  356. :disabled="currentNode.nodeCode != 'SPOT_RECONNAISSANCE'"
  357. class="filter-item">
  358. </el-input-number>
  359. </el-form-item>
  360. </el-col>
  361. </el-row>
  362. <el-row class="row-style">
  363. <el-col :xs="24" :sm="12" :lg="24" :span="6">
  364. <el-form-item label="实勘备注:" prop="remark" label-width="120px" class="postInfo-container-item">
  365. <el-input v-model="sceneForm.remark" :autosize="{ minRows: 3, maxRows: 3 }" class="filter-item" :readonly="currentNode.nodeCode != 'SPOT_RECONNAISSANCE'"
  366. :disabled="currentNode.nodeCode != 'SPOT_RECONNAISSANCE'"
  367. type="textarea" />
  368. </el-form-item>
  369. </el-col>
  370. </el-row>
  371. </div>
  372. </div>
  373. </div>
  374. </el-form>
  375. </el-tab-pane>
  376. <el-tab-pane id="evaluteObject" name="evaluate" class="pane-class" :lazy=true>
  377. <span slot="label"><i class="el-icon-office-building"></i> 评估对象</span>
  378. <el-form ref="targetForm" :model="target">
  379. <div class="createMajor-main-container">
  380. <div class="postInfo-container">
  381. <div>
  382. <el-divider content-position="left">
  383. <h3 class="title">
  384. <div class="avatar-wrapper icon-title">价格</div>
  385. <div class="icon-info">评估价格</div>
  386. </h3>
  387. </el-divider>
  388. </div>
  389. </div>
  390. </div>
  391. <el-row class="row-style">
  392. <el-col :xs="24" :sm="12" :lg="18" :span="6">
  393. <el-form-item label="流程:" prop="acreage" label-width="140px" class="postInfo-container-item" >
  394. <el-switch v-model="target.isOnline" style="margin-bottom: 5px;" active-text="线上" inactive-text="线下"
  395. @change="calculateSwith()"
  396. :readonly="!(currentNode.nodeCode === 'DETERMINE_PRICE' || currentNode.nodeCode === 'GENERATE_STATEMENT'|| currentNode.nodeCode === 'WRITE_REPORT' || currentNode.nodeCode === 'WRITE_LETTER')"
  397. :disabled="!(currentNode.nodeCode === 'DETERMINE_PRICE' || currentNode.nodeCode === 'GENERATE_STATEMENT'|| currentNode.nodeCode === 'WRITE_REPORT' || currentNode.nodeCode === 'WRITE_LETTER')"
  398. >
  399. </el-switch>
  400. </el-form-item>
  401. </el-col>
  402. <el-col :xs="12" :sm="12" :lg="4" :span="6">
  403. <el-form-item label="打印二维码:" prop="validateCode" label-width="140px" class="postInfo-container-item">
  404. <div class="qr-code-div">
  405. <img id="validateCode" class="qr-code" :src="target.validateCode" alt="未定价" @click="printQR()"/>
  406. </div>
  407. </el-form-item>
  408. </el-col>
  409. </el-row>
  410. <el-row class="row-style">
  411. <el-col :xs="12" :sm="12" :lg="18" :span="6">
  412. <el-form-item label="项目名称:" prop="location" label-width="140px" class="postInfo-container-item">
  413. <el-input v-model="personal.location" class="filter-item" />
  414. </el-form-item>
  415. </el-col>
  416. </el-row>
  417. <el-row class="row-style">
  418. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  419. <el-form-item label="委托方1:" prop="bailorA" label-width="140px" class="postInfo-container-item">
  420. <el-input v-model="personal.bailorA" class="filter-item" />
  421. </el-form-item>
  422. </el-col>
  423. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  424. <el-form-item label="委托方2:" prop="bailorB" label-width="140px" class="postInfo-container-item">
  425. <el-input v-model="personal.bailorB" class="filter-item" />
  426. </el-form-item>
  427. </el-col>
  428. </el-row>
  429. <el-row class="row-style">
  430. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  431. <el-form-item label="评估面积(平):" prop="acreage" label-width="140px"
  432. :rules="{ required: true, message: '评估面积不能为空', trigger: 'blur' }" class="postInfo-container-item">
  433. <el-input-number v-model="target.acreage" size="medium" controls-position="right" :min="0"
  434. :max="10000" style="width: 100%;"></el-input-number>
  435. </el-form-item>
  436. </el-col>
  437. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  438. <el-form-item label="评估单价(元):" prop="price" label-width="140px"
  439. :rules="{ required: true, message: '评估单价不能为空', trigger: 'blur' }" class="postInfo-container-item">
  440. <el-input-number v-model="target.price" size="medium" controls-position="right"
  441. :min="0" style="width: 100%;"></el-input-number>
  442. </el-form-item>
  443. </el-col>
  444. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  445. <el-form-item label="评估总价(元):" prop="amount" label-width="140px"
  446. :rules="{ required: true, message: '评估总价不能为空', trigger: 'blur' }" class="postInfo-container-item">
  447. <el-input-number v-model="target.amount" size="medium" controls-position="right"
  448. :min="0" style="width: 100%;"></el-input-number>
  449. </el-form-item>
  450. </el-col>
  451. <el-col :xs="24" :sm="12" :lg="6" :span="6">
  452. <el-button type="primary" round @click="savePrice()" style="margin-left: 20px;"
  453. v-if=" ( currentNode.nodeCode === 'DETERMINE_PRICE' || currentNode.nodeCode === 'REVIEW_STATEMENT'
  454. || currentNode.nodeCode === 'CHECK_REPORT' || currentNode.nodeCode === 'CHECK_LETTER')">保存</el-button>
  455. </el-col>
  456. </el-row>
  457. </el-form>
  458. </el-tab-pane>
  459. <el-tab-pane name="comparable" class="pane-class" :lazy=true :disabled="!target.isOnline">
  460. <span slot="label"><i class="el-icon-office-building"></i> 可比实例</span>
  461. <div class="createMajor-main-container">
  462. <div class="postInfo-container">
  463. <div>
  464. <el-divider content-position="left">
  465. <h3 class="title">
  466. <div class="avatar-wrapper icon-title">实例</div>
  467. <div class="icon-info">可比实例</div>
  468. </h3>
  469. </el-divider>
  470. </div>
  471. </div>
  472. </div>
  473. <el-form ref="compareToForm" :model="compareList" v-if="target.isOnline">
  474. <el-row class="row-style">
  475. <el-col :xs="24" :sm="12" :lg="4" :span="6">
  476. <el-form-item label="修正系数:" prop="fixValue" label-width="120px"
  477. :rules="{ required: true, message: '修正系数不能为空', trigger: 'blur' }" class="postInfo-container-item">
  478. <el-input-number v-model="compareList.fixValue" :step="0.1" :min="1" size="medium" style="width: 100%;"
  479. controls-position="right"></el-input-number>
  480. </el-form-item>
  481. </el-col>
  482. <el-col :xs="24" :sm="12" :lg="4" :span="6">
  483. <el-form-item label="是否划拨:" prop="rightsType" label-width="120px"
  484. :rules="{ required: true, message: '是否划拨不能为空', trigger: 'blur' }" class="postInfo-container-item">
  485. <el-select v-model="compareList.rightsType" placeholder="请选择" @change="selectRightsType()">
  486. <el-option label="划拨" value="ALLOT">划拨</el-option>
  487. <el-option label="出让" value="SELL">出让</el-option>
  488. </el-select>
  489. </el-form-item>
  490. </el-col>
  491. <el-col :xs="24" :sm="12" :lg="4" :span="6" v-show="compareList.rightsType === 'ALLOT'">
  492. <el-form-item label="环线位置:" prop="rollingLevel" label-width="120px"
  493. :rules="{ required: compareList.rightsType === 'ALLOT', message: '是否划拨不能为空', trigger: 'blur' }"
  494. class="postInfo-container-item">
  495. <el-select v-model="compareList.rollingLevel" placeholder="请选择" @change="selectRoll()">
  496. <el-option label="二环内" :value=1>二环内</el-option>
  497. <el-option label="二至三环" :value=2>二至三环</el-option>
  498. <el-option label="三环外" :value=3>三环外</el-option>
  499. </el-select>
  500. </el-form-item>
  501. </el-col>
  502. <el-col :xs="24" :sm="12" :lg="5" :span="6">
  503. <el-form-item label="计算方式:" prop="calculateType" label-width="120px"
  504. :rules="{ required: true, message: '计算方式不能为空', trigger: 'blur' }" class="postInfo-container-item">
  505. <el-select v-model="compareList.calculateType" clearable placeholder="请选择"
  506. @change="selectCalculateType()">
  507. <el-option label="简单算术平均" value="SIMPLE">简单算术平均</el-option>
  508. <el-option label="加权算术平均" value="WEIGHT">加权算术平均</el-option>
  509. </el-select>
  510. </el-form-item>
  511. </el-col>
  512. <el-col :xs="24" :sm="12" :lg="5" :span="6" style="margin-left: 20px;">
  513. <el-button type="info" round @click="calulate()"
  514. v-if="currentNode.nodeCode === 'DETERMINE_PRICE' || currentNode.nodeCode === 'GENERATE_STATEMENT'|| currentNode.nodeCode === 'WRITE_REPORT' || currentNode.nodeCode === 'WRITE_LETTER'">计算价格</el-button>
  515. <el-button type="primary" round @click="saveCalulateResult()"
  516. v-if="currentNode.nodeCode === 'DETERMINE_PRICE' || currentNode.nodeCode === 'GENERATE_STATEMENT'|| currentNode.nodeCode === 'WRITE_REPORT' || currentNode.nodeCode === 'WRITE_LETTER'">保存价格</el-button>
  517. </el-col>
  518. </el-row>
  519. <el-table v-loading="calculating" element-loading-text="正在计算..." element-loading-spinner="el-icon-loading"
  520. element-loading-background="rgba(144, 147, 153, 0.5)" :data="compareList.analysisData" border="border"
  521. stripe :header-cell-style="{ color: '#333333' }" style="
  522. border-left: 1px solid #ebeced;
  523. border-right: 1px solid #ebeced;
  524. color: #333333; font-size: 16px;">
  525. <el-table-column prop="index" label="指标" width="180" align="center">
  526. <template scope="scope">
  527. <span v-if="requiredIndex.includes(scope.row.index)" style="color:red">* </span>
  528. <span>{{ scope.row.index }}</span>
  529. </template>
  530. </el-table-column>
  531. <el-table-column prop="compareA" label="实例A" align="center">
  532. <template scope="scope" style="float:right">
  533. <div v-if="needWeight.includes(scope.row.index)">
  534. <el-input style="width:60%" v-model="scope.row.compareA.valueA" />
  535. <el-input-number v-model="scope.row.compareA.weight" :max="150" :min="1" size="small"
  536. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  537. </div>
  538. <div v-else-if="scope.row.index === '市场状况'">
  539. <el-date-picker v-model="scope.row.compareA.valueA" type="month" style="width:60%" placeholder="选择月">
  540. </el-date-picker>
  541. <el-input-number v-model="scope.row.compareA.weight" :max="150" :min="1" size="small"
  542. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  543. </div>
  544. <div v-else-if="scope.row.index === '楼层/总楼层'">
  545. <el-input style="width:26%" v-model="scope.row.compareA.valueA" />
  546. <span style="margin-left:2%;margin-right:2%">/</span>
  547. <el-input style="width:26%" v-model="scope.row.compareA.valueB" />
  548. <el-input-number v-model="scope.row.compareA.weight" :min="1" :max="150" size="small"
  549. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  550. </div>
  551. <div v-else-if="scope.row.index === '修正后价格'">
  552. <span v-if="scope.row.compareA.valueA"
  553. style="color:RGB(144,147,153);font-weight:bold;font-size:20px">¥{{ parseFloat(scope.row.compareA.valueA).toLocaleString() }}</span>
  554. </div>
  555. <div v-else-if="scope.row.index === '权重'">
  556. <el-input-number v-if="compareList.calculateType === 'WEIGHT'" v-model="scope.row.compareA.valueA"
  557. style="width:100%;" :min="0" :max="1" size="small" :step="0.1"
  558. controls-position="right"></el-input-number>
  559. </div>
  560. <div v-else-if="scope.row.index === '总价(元)'">
  561. <span v-if="scope.row.compareA.valueA"
  562. style="color:RGB(144,147,153);font-weight:bold;font-size:16px">¥{{ parseFloat(scope.row.compareA.valueA).toLocaleString() }}</span>
  563. </div>
  564. <div v-else-if="scope.row.index === '单价(元)'">
  565. <el-input-number v-model="scope.row.compareA.valueA" style="width:100%;" :min="0" size="small"
  566. controls-position="right"></el-input-number>
  567. </div>
  568. <div v-else-if="scope.row.index === '室内装饰'">
  569. <el-select v-model="scope.row.compareA.valueA" placeholder="请选择" style="width:60%">
  570. <el-option label="精装" value="精装">精装</el-option>
  571. <el-option label="中等装修" value="中等装修">中等装修</el-option>
  572. <el-option label="简装" value="简装">简装</el-option>
  573. <el-option label="清水" value="清水">清水</el-option>
  574. </el-select>
  575. <el-input-number v-model="scope.row.compareA.weight" :max="150" :min="1" size="small"
  576. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  577. </div>
  578. <div v-else>
  579. <el-input style="width:100%" v-model="scope.row.compareA.valueA" />
  580. </div>
  581. </template>
  582. </el-table-column>
  583. <el-table-column prop="compareB" label="实例B" align="center">
  584. <template scope="scope" style="float:right">
  585. <div v-if="needWeight.includes(scope.row.index)">
  586. <el-input style="width:60%" v-model="scope.row.compareB.valueA" />
  587. <el-input-number v-model="scope.row.compareB.weight" :max="150" :min="1" size="small"
  588. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  589. </div>
  590. <div v-else-if="scope.row.index === '市场状况'">
  591. <el-date-picker v-model="scope.row.compareB.valueA" type="month" style="width:60%" placeholder="选择月">
  592. </el-date-picker>
  593. <el-input-number v-model="scope.row.compareB.weight" :max="150" :min="1" size="small"
  594. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  595. </div>
  596. <div v-else-if="scope.row.index === '楼层/总楼层'">
  597. <el-input style="width:26%" v-model="scope.row.compareB.valueA" />
  598. <span style="margin-left:2%;margin-right:2%">/</span>
  599. <el-input style="width:26%" v-model="scope.row.compareB.valueB" />
  600. <el-input-number v-model="scope.row.compareB.weight" :min="1" :max="150" size="small"
  601. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  602. </div>
  603. <div v-else-if="scope.row.index === '修正后价格'">
  604. <span v-if="scope.row.compareB.valueA"
  605. style="color:RGB(144,147,153);font-weight:bold;font-size:20px">¥{{ parseFloat(scope.row.compareB.valueA).toLocaleString() }}</span>
  606. </div>
  607. <div v-else-if="scope.row.index === '权重'">
  608. <el-input-number v-if="compareList.calculateType === 'WEIGHT'" v-model="scope.row.compareB.valueA"
  609. style="width:100%;" :min="0" :max="1" size="small" :step="0.1"
  610. controls-position="right"></el-input-number>
  611. </div>
  612. <div v-else-if="scope.row.index === '总价(元)'">
  613. <span v-if="scope.row.compareB.valueA"
  614. style="color:RGB(144,147,153);font-weight:bold;font-size:16px">¥{{ parseFloat(scope.row.compareB.valueA).toLocaleString() }}</span>
  615. </div>
  616. <div v-else-if="scope.row.index === '单价(元)'">
  617. <el-input-number v-model="scope.row.compareB.valueA" style="width:100%;" :min="0" size="small"
  618. controls-position="right"></el-input-number>
  619. </div>
  620. <div v-else-if="scope.row.index === '室内装饰'">
  621. <el-select v-model="scope.row.compareB.valueA" placeholder="请选择" style="width:60%">
  622. <el-option label="精装" value="精装">精装</el-option>
  623. <el-option label="中等装修" value="中等装修">中等装修</el-option>
  624. <el-option label="简装" value="简装">简装</el-option>
  625. <el-option label="清水" value="清水">清水</el-option>
  626. </el-select>
  627. <el-input-number v-model="scope.row.compareB.weight" :max="150" :min="1" size="small"
  628. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  629. </div>
  630. <div v-else>
  631. <el-input style="width:100%" v-model="scope.row.compareB.valueA" />
  632. </div>
  633. </template>
  634. </el-table-column>
  635. <el-table-column prop="compareC" label="实例C" align="center">
  636. <template scope="scope" style="float:right">
  637. <div v-if="needWeight.includes(scope.row.index)">
  638. <el-input style="width:60%" v-model="scope.row.compareC.valueA" />
  639. <el-input-number v-model="scope.row.compareC.weight" :max="150" :min="1" size="small"
  640. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  641. </div>
  642. <div v-else-if="scope.row.index === '市场状况'">
  643. <el-date-picker v-model="scope.row.compareC.valueA" type="month" style="width:60%" placeholder="选择月">
  644. </el-date-picker>
  645. <el-input-number v-model="scope.row.compareC.weight" :max="150" :min="1" size="small"
  646. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  647. </div>
  648. <div v-else-if="scope.row.index === '楼层/总楼层'">
  649. <el-input style="width:26%" v-model="scope.row.compareC.valueA" />
  650. <span style="margin-left:2%;margin-right:2%">/</span>
  651. <el-input style="width:26%" v-model="scope.row.compareC.valueB" />
  652. <el-input-number v-model="scope.row.compareC.weight" :min="1" :max="150" size="small"
  653. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  654. </div>
  655. <div v-else-if="scope.row.index === '修正后价格'">
  656. <span v-if="scope.row.compareC.valueA"
  657. style="color:RGB(144,147,153);font-weight:bold;font-size:20px">¥{{ parseFloat(scope.row.compareC.valueA).toLocaleString() }}</span>
  658. </div>
  659. <div v-else-if="scope.row.index === '权重'">
  660. <el-input-number v-if="compareList.calculateType === 'WEIGHT'" v-model="scope.row.compareC.valueA"
  661. style="width:100%;" :min="0" :max="1" size="small" :step="0.1"
  662. controls-position="right"></el-input-number>
  663. </div>
  664. <div v-else-if="scope.row.index === '总价(元)'">
  665. <span v-if="scope.row.compareC.valueA"
  666. style="color:RGB(144,147,153);font-weight:bold;font-size:16px">¥{{ parseFloat(scope.row.compareC.valueA).toLocaleString() }}</span>
  667. </div>
  668. <div v-else-if="scope.row.index === '单价(元)'">
  669. <el-input-number v-model="scope.row.compareC.valueA" style="width:100%;" :min="0" size="small"
  670. controls-position="right"></el-input-number>
  671. </div>
  672. <div v-else-if="scope.row.index === '室内装饰'">
  673. <el-select v-model="scope.row.compareC.valueA" placeholder="请选择" style="width:60%">
  674. <el-option label="精装" value="精装">精装</el-option>
  675. <el-option label="中等装修" value="中等装修">中等装修</el-option>
  676. <el-option label="简装" value="简装">简装</el-option>
  677. <el-option label="清水" value="清水">清水</el-option>
  678. </el-select>
  679. <el-input-number v-model="scope.row.compareC.weight" :max="150" :min="1" size="small"
  680. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  681. </div>
  682. <div v-else>
  683. <el-input style="width:100%" v-model="scope.row.compareC.valueA" />
  684. </div>
  685. </template>
  686. </el-table-column>
  687. <el-table-column prop="target" label="评估对象" align="center">
  688. <template scope="scope" style="float:right">
  689. <div v-if="needWeight.includes(scope.row.index)">
  690. <el-input style="width:60%" v-model="scope.row.target.valueA" />
  691. <el-input-number v-model="scope.row.target.weight" :min="1" size="small" controls-position="right"
  692. style="width:30%;margin-left:10%"></el-input-number>
  693. </div>
  694. <div v-else-if="scope.row.index === '市场状况'">
  695. <el-date-picker v-model="scope.row.target.valueA" type="month" style="width:60%" placeholder="选择月">
  696. </el-date-picker>
  697. <el-input-number v-model="scope.row.target.weight" :max="150" :min="1" size="small"
  698. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  699. </div>
  700. <div v-else-if="scope.row.index === '楼层/总楼层'">
  701. <el-input style="width:26%" v-model="scope.row.target.valueA" />
  702. <span style="margin-left:2%;margin-right:2%">/</span>
  703. <el-input style="width:26%" v-model="scope.row.target.valueB" />
  704. <el-input-number v-model="scope.row.target.weight" :max="150" :min="1" size="small"
  705. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  706. </div>
  707. <div v-else-if="scope.row.index === '修正后价格'">
  708. <span v-if="scope.row.target.valueA"
  709. style="color:red;font-weight:bold;font-size:20px">¥{{ parseFloat(scope.row.target.valueA).toLocaleString() }}</span>
  710. </div>
  711. <div v-else-if="scope.row.index === '权重'">
  712. <el-input-number v-if="false" v-model="scope.row.target.valueA" style="width:100%;" :min="0" :max="1"
  713. size="small" :step="0.1" controls-position="right"></el-input-number>
  714. </div>
  715. <div v-else-if="scope.row.index === '总价(元)' || scope.row.index === '单价(元)'">
  716. <span v-if="scope.row.target.valueA"
  717. style="color:red;font-weight:bold;font-size:16px">¥{{ parseFloat(scope.row.target.valueA).toLocaleString() }}</span>
  718. </div>
  719. <div v-else-if="scope.row.index === '室内装饰'">
  720. <el-select v-model="scope.row.target.valueA" placeholder="请选择" style="width:60%">
  721. <el-option label="精装" value="精装">精装</el-option>
  722. <el-option label="中等装修" value="中等装修">中等装修</el-option>
  723. <el-option label="简装" value="简装">简装</el-option>
  724. <el-option label="清水" value="清水">清水</el-option>
  725. </el-select>
  726. <el-input-number v-model="scope.row.target.weight" :max="150" :min="1" size="small"
  727. controls-position="right" style="width:30%;margin-left:10%"></el-input-number>
  728. </div>
  729. <div v-else>
  730. <el-input style="width:100%" v-model="scope.row.target.valueA" />
  731. </div>
  732. </template>
  733. </el-table-column>
  734. </el-table>
  735. </el-form>
  736. </el-tab-pane>
  737. <el-tab-pane name="certificateInfo" class="pane-class" :lazy=true :disabled="!target.isOnline">
  738. <span slot="label"><i class="el-icon-postcard"></i> 证件信息</span>
  739. <el-tabs v-model="certificateInfo">
  740. <el-tab-pane name="CHANGE" class="pane-class" :lazy=true :disabled="!certificateCouldEdit">
  741. <span slot="label" :style="certificateCouldEdit?'color:red':'color:RGB(168,168,168)'"><i class="el-icon-refresh"></i> 换证</span>
  742. <div >
  743. <el-checkbox-group v-model="changeCredentials" size="medium" style="float: left;">
  744. <el-checkbox-button label="HOUSE_CERTIFICATE" name="credentials">房产证</el-checkbox-button>
  745. <el-checkbox-button label="LAND_CERTIFICATE" name="credentials">国土证</el-checkbox-button>
  746. <el-checkbox-button label="IMMOVABLE_CERTIFICATE" name="credentials">不动产权证</el-checkbox-button>
  747. </el-checkbox-group>
  748. <el-button type="danger" round style="float: left; margin-left: 20px;margin-top: 2px" @click="saveChangeCer()">确认换证</el-button>
  749. </div>
  750. </el-tab-pane>
  751. <el-tab-pane name="HOUSE_CERTIFICATE" class="pane-class" :lazy=true v-if="houseShow">
  752. <span slot="label"><i class="el-icon-postcard"></i> 房产证</span>
  753. <HouseCertificate ref="houseComponent" @custom-event="getPersonalTarget()" :id="target.id" :linkAttributes="linkAttributes"
  754. :houseCertificateObject="target.houseCertificate" :editStatus="certificateCouldEdit">
  755. </HouseCertificate>
  756. </el-tab-pane>
  757. <el-tab-pane name="LAND_CERTIFICATE" class="pane-class" :lazy=true v-if="landShow">
  758. <span slot="label"><i class="el-icon-postcard"></i> 国土证</span>
  759. <LandCertificate ref="landComponent" @custom-event="getPersonalTarget()" :id="target.id" :linkAttributes="linkAttributes"
  760. :landCertificateObject="target.landCertificate" :editStatus="certificateCouldEdit"></LandCertificate>
  761. </el-tab-pane>
  762. <el-tab-pane name="IMMOVABLE_CERTIFICATE" class="pane-class" :lazy=true v-if="immovalbeShow">
  763. <span slot="label"><i class="el-icon-postcard"></i> 不动产权证</span>
  764. <ImmovableCertificate ref="immovComponent" @custom-event="getPersonalTarget()" :id="target.id" :linkAttributes="linkAttributes"
  765. :immovableCertificateObject="target.immovableCertificate" :editStatus="certificateCouldEdit">
  766. </ImmovableCertificate>
  767. </el-tab-pane>
  768. </el-tabs>
  769. </el-tab-pane>
  770. <el-tab-pane name="otherInfo" class="pane-class" :lazy=true :disabled="!target.isOnline">
  771. <span slot="label"><i class="el-icon-chat-line-square"></i> 附加信息</span>
  772. <el-tabs v-model="otherInfo">
  773. <el-tab-pane name="entityInfo" class="pane-class" :lazy=true>
  774. <span slot="label"><i class="el-icon-paperclip"></i> 实物状况</span>
  775. <EntityInfo @custom-event="getPersonalTarget()" ref="entityCompent" :id="target.id" :linkAttributes="linkAttributes"
  776. :entityInfoObject="target.entityInfo" :editStatus="certificateCouldEdit"></EntityInfo>
  777. </el-tab-pane>
  778. <el-tab-pane name="backgroundInfo" class="pane-class" :lazy=true>
  779. <span slot="label"><i class="el-icon-paperclip"></i> 区位状况</span>
  780. <BackgroundInfo @custom-event="getPersonalTarget()" :id="target.id" :backgroundInfoObject="target.backgroundInfo"
  781. :editStatus="certificateCouldEdit"></BackgroundInfo>
  782. </el-tab-pane>
  783. <el-tab-pane name="sellingAbilityInfo" class="pane-class" :lazy=true>
  784. <span slot="label"><i class="el-icon-paperclip"></i> 变现能力</span>
  785. <SellingAbilityInfo @custom-event="getPersonalTarget()" :id="target.id" :sellingAbilityInfoObject="target.sellingAbility"
  786. :editStatus="certificateCouldEdit" :outWardStaffId="personal.outwardStaff"></SellingAbilityInfo>
  787. </el-tab-pane>
  788. </el-tabs>
  789. </el-tab-pane>
  790. <el-tab-pane name="producution" class="pane-class" :lazy=true>
  791. <span slot="label"><i class="el-icon-document-checked"></i> 产品信息</span>
  792. <div class="createMajor-main-container" v-if="currentNode.nodeCode==='QUOTATION_FEEDBACK' || currentNode.nodeCode ==='STATEMENT_FEEDBACK'">
  793. <div class="postInfo-container">
  794. <div>
  795. <el-divider content-position="left">
  796. <h3 class="title">
  797. <div class="avatar-wrapper icon-title">反馈</div>
  798. <div class="icon-info">客户反馈</div>
  799. </h3>
  800. </el-divider>
  801. </div>
  802. <el-form ref="feedbackFrom" class="form-container" style="margin-top:30px" :rules="rules">
  803. <el-row>
  804. <el-col :xs="24" :sm="12" :lg="8" :span="6">
  805. <el-form-item label="出具产品类型:" prop="production" label-width="160px" class="postInfo-container-item">
  806. <el-checkbox-group v-model="feedback" @change="saveFeedback()">
  807. <el-checkbox-button label="STATEMENT" name="production">价值意见书</el-checkbox-button>
  808. <el-checkbox-button label="REPORT" name="production">报告</el-checkbox-button>
  809. <el-checkbox-button label="LETTER" name="production">复评函</el-checkbox-button>
  810. <el-tooltip class="item" effect="dark" content="只出具价值意见书,不再出具其他产品。" placement="top-start">
  811. <el-checkbox-button v-if="currentNode.nodeCode === 'STATEMENT_FEEDBACK'" label="NONE"
  812. name="production">不再出具</el-checkbox-button>
  813. </el-tooltip>
  814. </el-checkbox-group>
  815. </el-form-item>
  816. </el-col>
  817. </el-row>
  818. </el-form>
  819. </div>
  820. </div>
  821. <div class="createMajor-main-container">
  822. <div class="postInfo-container">
  823. <div>
  824. <el-divider content-position="left">
  825. <h3 class="title">
  826. <div class="avatar-wrapper icon-title">产品</div>
  827. <div class="icon-info">产品信息</div>
  828. </h3>
  829. </el-divider>
  830. </div>
  831. </div>
  832. </div>
  833. <div v-if="showProds" style="display: flex;margin-top: 50px;margin-bottom: 20px; width: 100%;">
  834. <el-card :body-style="{ padding: '0px' }" shadow="always" style="margin-left: 5%; margin-right: 5%; width: 20%;"
  835. v-if="hasStatement">
  836. <img :src="statementCardPNG" class="image">
  837. <div style="padding: 14px;">
  838. <span>房地产意见书</span>
  839. <span class="checked">{{ statementProd.checkState }}<i v-if="statementProd.checkState"
  840. class="el-icon-circle-check"></i></span>
  841. <time class="time">{{ statementProd.modified }}</time>
  842. <div class="control">
  843. <el-button type="text" class="button" @click="doStamp(statementProd.files)"
  844. :disabled="currentNode.nodeCode != 'GENERATE_STATEMENT' || !statementProd.isOnline" >加盖公章</el-button>
  845. <el-button type="text" class="button" @click="warehouse()"
  846. :disabled="currentNode.nodeCode != 'STATEMENT_IN' && currentNode.nodeCode != 'STATEMENT_OUT'">出入库</el-button>
  847. <el-button type="text" class="button" @click="genProductionFile(1)"
  848. :disabled="currentNode.nodeCode != 'GENERATE_STATEMENT'">系统生成</el-button>
  849. </div>
  850. </div>
  851. <el-upload style="position: relative; top: -10px; padding: 10px;"
  852. :action="'/api/personalProduction/upload/' + target.id + '/1'" :file-list="statementProd.files" :limit="1"
  853. :on-exceed="handleExceed" :on-preview="handleAttachmentPreview" :on-success="getProductions"
  854. :before-remove="handleRemoveFile">
  855. <el-button type="text" style="position: relative; left: 10px;top: -4px;"
  856. :disabled="currentNode.nodeCode != 'GENERATE_STATEMENT'">手动上传</el-button>
  857. </el-upload>
  858. </el-card>
  859. <el-card :body-style="{ padding: '0px' }" shadow="always" style="margin-left: 5%; margin-right: 5%;width: 20%;"
  860. v-if="hasReport">
  861. <img :src="technicCardPNG" class="image">
  862. <div style="padding: 14px;">
  863. <span>技术报告</span>
  864. <span class="checked">{{ technicReportProd.checkState }}<i v-if="technicReportProd.checkState"
  865. class="el-icon-circle-check"></i></span>
  866. <time class="time">{{ technicReportProd.modified }}</time>
  867. <div class="control">
  868. <el-button type="text" class="button" @click="doStamp(technicReportProd.files)"
  869. :disabled="currentNode.nodeCode != 'WRITE_REPORT'">加盖公章</el-button>
  870. <el-button type="text" class="button" @click="warehouse()"
  871. :disabled="currentNode.nodeCode != 'REPORT_IN' && currentNode.nodeCode != 'REPORT_OUT'">出入库</el-button>
  872. <el-button type="text" class="button" @click="genProductionFile(2)"
  873. :disabled="currentNode.nodeCode != 'WRITE_REPORT'">系统生成</el-button>
  874. </div>
  875. </div>
  876. <el-upload style="position: relative; top: -10px; padding: 10px;"
  877. :action="'/api/personalProduction/upload/' + target.id + '/2'" :file-list="technicReportProd.files" :limit="1"
  878. :on-exceed="handleExceed" :on-preview="handleAttachmentPreview" :on-success="getProductions"
  879. :before-remove="handleRemoveFile">
  880. <el-button type="text" style="position: relative; left: 10px;top: -4px;"
  881. :disabled="currentNode.nodeCode != 'WRITE_REPORT'">手动上传</el-button>
  882. </el-upload>
  883. </el-card>
  884. <el-card :body-style="{ padding: '0px' }" shadow="always" style="margin-left: 5%; margin-right: 5%;width: 20%;"
  885. v-if="hasReport">
  886. <img :src="finalCardPNG" class="image">
  887. <div style="padding: 14px;">
  888. <span>结果报告</span>
  889. <span class="checked">{{ finalReprotProd.checkState }}<i v-if="finalReprotProd.checkState"
  890. class="el-icon-circle-check"></i></span>
  891. <time class="time">{{ finalReprotProd.modified }}</time>
  892. <div class="control">
  893. <el-button type="text" class="button" @click="doStamp(finalReprotProd.files)"
  894. :disabled="currentNode.nodeCode != 'WRITE_REPORT'">加盖公章</el-button>
  895. <el-button type="text" class="button" @click="warehouse()"
  896. :disabled="currentNode.nodeCode != 'REPORT_IN' && currentNode.nodeCode != 'REPORT_OUT'">出入库</el-button>
  897. <el-button type="text" class="button" @click="genProductionFile(3)"
  898. :disabled="currentNode.nodeCode != 'WRITE_REPORT'">系统生成</el-button>
  899. </div>
  900. </div>
  901. <el-upload style="position: relative; top: -10px;padding: 10px;"
  902. :action="'/api/personalProduction/upload/' + target.id + '/3'" :file-list="finalReprotProd.files" :limit="1"
  903. :on-exceed="handleExceed" :on-preview="handleAttachmentPreview" :on-success="getProductions"
  904. :before-remove="handleRemoveFile">
  905. <el-button type="text" style="position: relative; left: 10px;top: -4px;"
  906. :disabled="currentNode.nodeCode != 'WRITE_REPORT'">手动上传</el-button>
  907. </el-upload>
  908. </el-card>
  909. <el-card :body-style="{ padding: '0px' }" shadow="always" style="margin-left: 5%; margin-right: 5%;width: 20%;"
  910. v-if="hasLetter">
  911. <img :src="letterCardPNG" class="image">
  912. <div style="padding: 14px;">
  913. <span>复评函</span>
  914. <span class="checked">{{ letterReprotProd.checkState }}<i v-if="letterReprotProd.checkState"
  915. class="el-icon-circle-check"></i></span>
  916. <time class="time">{{ letterReprotProd.modified }}</time>
  917. <div class="control">
  918. <el-button type="text" class="button" @click="warehouse()"
  919. :disabled="currentNode.nodeCode != 'LETTER_IN' && currentNode.nodeCode != 'LETTER_OUT'">出入库</el-button>
  920. </div>
  921. </div>
  922. <el-upload style="position: relative; top: -10px;padding: 10px;"
  923. :action="'/api/personalProduction/upload/' + target.id + '/4'" :file-list="letterReprotProd.files" :limit="1"
  924. :on-exceed="handleExceed" :on-preview="handleAttachmentPreview" :on-success="getProductions"
  925. :before-remove="handleRemoveFile">
  926. <el-button type="text" style="position: relative; left: 10px;top: -4px;"
  927. :disabled="currentNode.nodeCode != 'WRITE_LETTER'">手动上传</el-button>
  928. </el-upload>
  929. </el-card>
  930. </div>
  931. <div v-else style="display: flex;margin-top: 100px; width: 100%;">
  932. <span style="color:rgb(144,147,153); margin-left: 2.2%; width: 20%; margin-top:-3%">还没有选择产品类型</span>
  933. </div>
  934. </el-tab-pane>
  935. <el-tab-pane name="workflowLog" class="pane-class" :lazy=true>
  936. <span slot="label"><i class="el-icon-date"></i> 流程日志</span>
  937. <div class="createMajor-main-container">
  938. <div class="postInfo-container">
  939. <div>
  940. <el-divider content-position="left">
  941. <h3 class="title">
  942. <div class="avatar-wrapper icon-title">日志</div>
  943. <div class="icon-info">流程审批日志</div>
  944. </h3>
  945. </el-divider>
  946. </div>
  947. </div>
  948. </div>
  949. <el-table :data="workflowLogs" stripe :header-row-style="{ color: '#333333' }" border
  950. style="width: 100%; margin-top:20px">
  951. <el-table-column prop="nodeName" label="节点名称" align="center">
  952. </el-table-column>
  953. <el-table-column prop="state" label="处理结果" align="center">
  954. </el-table-column>
  955. <el-table-column prop="handlerName" label="处理人" align="center">
  956. </el-table-column>
  957. <el-table-column prop="longTime" label="处理时长" align="center">
  958. </el-table-column>
  959. <el-table-column prop="created" label="处理时间" align="center">
  960. </el-table-column>
  961. <el-table-column prop="comments" label="处理意见" align="center" show-overflow-tooltip>
  962. </el-table-column>
  963. </el-table>
  964. </el-tab-pane>
  965. </el-tabs>
  966. <el-dialog :visible.sync="decideProductionTypeDialog" width="25%" center top="35vh" custom-class="doWarehouseClass">
  967. <div>
  968. <i class="el-icon-warning" style="color:RGB(230,162,60);font-size:22px;margin-right:10px;"></i>
  969. <span style="position:absolute;top:58px">在此节点是否确定产品类型?</span>
  970. </div>
  971. <div style="margin-top:30px;margin-left:20px">
  972. <el-radio-group v-model="target.feedback">
  973. <el-radio label="NONE" value="NONE">不确定</el-radio>
  974. <el-radio label="STATEMENT" value="STATEMENT">价值意见书</el-radio>
  975. <el-radio label="REPORT" value="REPORT">报告</el-radio>
  976. <el-radio label="LETTER" value="LETTER">复评函</el-radio>
  977. </el-radio-group>
  978. </div>
  979. <span slot="footer" class="dialog-footer">
  980. <el-button @click="decideProductionTypeDialog = false">取消</el-button>
  981. <el-button type="primary" @click="saveFeedbackWhenPrice()">保存</el-button>
  982. </span>
  983. </el-dialog>
  984. <el-dialog :visible.sync="inWarehouseDialog" width="30%" center top="35vh" custom-class="doWarehouseClass">
  985. <div>
  986. <i class="el-icon-warning" style="color:RGB(230,162,60);font-size:22px;margin-right:10px;"></i>
  987. <span style="position:absolute;top:58px;padding-right:50px;font-size: 20px">{{ warehouseTip }}</span>
  988. </div>
  989. <span slot="footer" class="dialog-footer">
  990. <el-button @click="inWarehouseDialog = false">取 消</el-button>
  991. <el-button type="primary" @click="doInWareHouse()">确 定</el-button>
  992. </span>
  993. </el-dialog>
  994. <el-dialog :visible.sync="outWarehouseDialog" width="30%" center top="35vh" custom-class="doWarehouseClass">
  995. <div>
  996. <i class="el-icon-warning" style="color:RGB(230,162,60);font-size:22px;margin-right:10px;"></i>
  997. <span style="position:absolute;top:58px;font-size: 20px">{{ warehouseTip }}</span>
  998. </div>
  999. <span slot="footer" class="dialog-footer">
  1000. <el-button @click="outWarehouseDialog = false">取 消</el-button>
  1001. <el-button type="primary" @click="doOutWareHouse()">确 定</el-button>
  1002. </span>
  1003. </el-dialog>
  1004. <el-dialog :visible.sync="checkDialog" width="50%" center top="25vh" custom-class="doWarehouseClass">
  1005. <el-divider content-position="left">产品审核</el-divider>
  1006. <el-form ref="targetForm" :model="target">
  1007. <el-row>
  1008. <el-col :xs="24" :sm="12" :lg="24" :span="6">
  1009. <el-form-item label="项目名称:" prop="location" label-width="140px" class="postInfo-container-item">
  1010. <el-input :value="target.location" class="filter-item" disabled readonly style=" width: 100%" />
  1011. </el-form-item>
  1012. </el-col>
  1013. </el-row>
  1014. <el-row>
  1015. <el-col :xs="24" :sm="12" :lg="8" :span="6">
  1016. <el-form-item label="委托方1:" prop="bailorA" label-width="140px" class="postInfo-container-item">
  1017. <el-input :value="personal.bailorA" disabled readonly class="filter-item" />
  1018. </el-form-item>
  1019. </el-col>
  1020. <el-col :xs="24" :sm="12" :lg="8" :span="6">
  1021. <el-form-item label="委托方2:" prop="bailorB" label-width="140px" class="postInfo-container-item">
  1022. <el-input :value="personal.bailorB" disabled readonly class="filter-item" />
  1023. </el-form-item>
  1024. </el-col>
  1025. </el-row>
  1026. <el-row>
  1027. <el-col :xs="24" :sm="12" :lg="8" :span="6">
  1028. <el-form-item label="评估面积:" prop="acreage" label-width="140px" class="postInfo-container-item">
  1029. <el-input v-model="target.acreage" disabled readonly>
  1030. <template slot="append">
  1031. <span>平</span>
  1032. </template>
  1033. </el-input>
  1034. </el-form-item>
  1035. </el-col>
  1036. <el-col :xs="24" :sm="12" :lg="8" :span="6">
  1037. <el-form-item label="评估单价:" prop="price" label-width="140px" class="postInfo-container-item">
  1038. <el-input v-model="target.price" disabled readonly>
  1039. <template slot="append">
  1040. <span>元</span>
  1041. </template>
  1042. </el-input>
  1043. </el-form-item>
  1044. </el-col>
  1045. <el-col :xs="24" :sm="12" :lg="8" :span="6">
  1046. <el-form-item label="评估总价:" prop="amount" label-width="140px" class="postInfo-container-item">
  1047. <el-input v-model="target.amount" disabled readonly>
  1048. <template slot="append">
  1049. <span>元</span>
  1050. </template>
  1051. </el-input>
  1052. </el-form-item>
  1053. </el-col>
  1054. </el-row>
  1055. <el-row>
  1056. <el-col :xs="24" :sm="12" :lg="24" :span="6">
  1057. <el-form-item label="备注:" prop="amount" label-width="140px" class="postInfo-container-item">
  1058. <span style="font-weight: bolder; color: red;">本人已对评估结果信息及报告文档完成审核,已确认无误。</span>
  1059. </el-form-item>
  1060. </el-col>
  1061. </el-row>
  1062. <el-row>
  1063. <el-col :xs="24" :sm="12" :lg="24" :span="6">
  1064. <el-button type="info" style="margin-left: 40%;" @click="checkDialog = false">取消</el-button>
  1065. <el-button type="success" @click="checkPass()">确认</el-button>
  1066. </el-col>
  1067. </el-row>
  1068. </el-form>
  1069. </el-dialog>
  1070. </div>
  1071. </template>
  1072. <script>
  1073. import YDetailPageLayout from '@/components/YDetailPageLayout/index_detail'
  1074. import WorkflowBoard from '@/components/workflowBoard'
  1075. import { calculateTargetPrice, validateParams } from '@/utils/personalUtil'
  1076. import HouseCertificate from '@/components/personalForms/houseCertificate'
  1077. import LandCertificate from '@/components/personalForms/landCertificate'
  1078. import ImmovableCertificate from '@/components/personalForms/immovableCertificate'
  1079. import EntityInfo from '@/components/personalForms/entityInfo'
  1080. import BackgroundInfo from '@/components/personalForms/backgroundInfo'
  1081. import SellingAbilityInfo from '@/components/personalForms/sellingAbilityInfo'
  1082. import existPNG from '@/assets/images/exist.png'
  1083. import emptyPNG from '@/assets/images/empty.png'
  1084. export default {
  1085. name: 'personalTodoDetail',
  1086. components: {
  1087. YDetailPageLayout,
  1088. WorkflowBoard,
  1089. HouseCertificate,
  1090. LandCertificate,
  1091. ImmovableCertificate,
  1092. EntityInfo,
  1093. BackgroundInfo,
  1094. SellingAbilityInfo
  1095. },
  1096. watch: {
  1097. personal: {
  1098. handler(newVal, oldVal) {
  1099. if (newVal.outwardStaff) {
  1100. this.outwardStaffTip = false;
  1101. } else {
  1102. this.outwardStaffTip = true;
  1103. }
  1104. this.certificateInfo = newVal.credentials[0];
  1105. if (newVal.credentials.includes("HOUSE_CERTIFICATE")){
  1106. this.houseShow = true;
  1107. }else{
  1108. this.houseShow = false;
  1109. }
  1110. if (newVal.credentials.includes("LAND_CERTIFICATE")){
  1111. this.landShow = true;
  1112. }else{
  1113. this.landShow = false;
  1114. }
  1115. if (newVal.credentials.includes("IMMOVABLE_CERTIFICATE")){
  1116. this.immovalbeShow = true;
  1117. }else{
  1118. this.immovalbeShow = false;
  1119. }
  1120. this.changeCredentials = newVal.credentials;
  1121. },
  1122. deep: true
  1123. },
  1124. activeTagName: {
  1125. handler(newVal, oldVal) {
  1126. if (newVal != 'order') {
  1127. this.outwardStaffTip = false;
  1128. }
  1129. },
  1130. },
  1131. target: {
  1132. handler(newVal, oldVal) {
  1133. if (newVal.acreage != null && newVal.price != null) {
  1134. newVal.amount = Math.round(newVal.acreage * newVal.price)
  1135. }
  1136. if (newVal.id) {
  1137. this.getProductions();
  1138. }
  1139. if (newVal.isOnline){
  1140. this.jumpTabs();
  1141. }
  1142. },
  1143. deep: true
  1144. },
  1145. feedback: {
  1146. handler(newVal, oldVal) {
  1147. if (this.currentNode.nodeCode === 'STATEMENT_FEEDBACK' && !newVal.includes("STATEMENT")) {
  1148. //this.feedback.push("STATEMENT");
  1149. }
  1150. // if (this.currentNode.nodeCode === 'QUOTATION_FEEDBACK' && newVal.length>1) {
  1151. // this.$message("只能选择一种产品类型。");
  1152. // //this.feedback = oldVal;
  1153. // }
  1154. // if (this.currentNode.nodeCode === 'STATEMENT_FEEDBACK' && newVal.length!=2) {
  1155. // this.$message("只能选择一种产品类型。");
  1156. // //this.feedback = oldVal;
  1157. // }
  1158. // if ((newVal.includes("REPORT") && newVal.includes("LETTER")) ||
  1159. // (newVal.includes("REPORT") && newVal.includes("NONE")) ||
  1160. // (newVal.includes("LETTER") && newVal.includes("NONE"))) {
  1161. // this.$message('除意见书以外,只能选择剩余中的一种选项');
  1162. // //this.feedback = oldVal;
  1163. // }
  1164. this.nodeBusinessInfo.production = this.feedback;
  1165. this.$refs.board.getInstanceQueue();
  1166. if (this.feedback.includes("STATEMENT")) {
  1167. this.hasStatement = true;
  1168. } else {
  1169. this.hasStatement = false;
  1170. }
  1171. if (this.feedback.includes("REPORT")) {
  1172. this.hasReport = true;
  1173. } else {
  1174. this.hasReport = false;
  1175. }
  1176. if (this.feedback.includes("LETTER")) {
  1177. this.hasLetter = true;
  1178. } else {
  1179. this.hasLetter = false;
  1180. }
  1181. if (this.feedback.length > 0) {
  1182. this.showProds = true
  1183. } else {
  1184. this.showProds = false;
  1185. }
  1186. },
  1187. deep: true
  1188. },
  1189. 'compareList.analysisData':{
  1190. handler(newVal, oldVal) {
  1191. if (newVal[2].compareA.valueA && newVal[5].compareA.valueA){
  1192. newVal[1].compareA.valueA = newVal[2].compareA.valueA * newVal[5].compareA.valueA;
  1193. }
  1194. if (newVal[2].compareB.valueA && newVal[5].compareB.valueA){
  1195. newVal[1].compareB.valueA = newVal[2].compareB.valueA * newVal[5].compareB.valueA;
  1196. }
  1197. if (newVal[2].compareC.valueA && newVal[5].compareC.valueA){
  1198. newVal[1].compareC.valueA = newVal[2].compareC.valueA * newVal[5].compareC.valueA;
  1199. }
  1200. },
  1201. deep: true,
  1202. },
  1203. certificateInfo:{
  1204. handler(){
  1205. this.$nextTick(()=>{
  1206. if (this.$refs.immovComponent){
  1207. this.$refs.immovComponent.refreshLinkAttributes();
  1208. }
  1209. if (this.$refs.houseComponent){
  1210. this.$refs.houseComponent.refreshLinkAttributes();
  1211. }
  1212. if (this.$refs.landComponent){
  1213. this.$refs.landComponent.refreshLinkAttributes();
  1214. }
  1215. })
  1216. },
  1217. immediate:true
  1218. }
  1219. },
  1220. computed: {
  1221. certificateCouldEdit() {
  1222. let currentNodeCode = this.$route.query.currentNodeCode;
  1223. if (currentNodeCode === 'GENERATE_STATEMENT' || currentNodeCode === 'WRITE_REPORT' || currentNodeCode === 'WRITE_LETTER') {
  1224. return true;
  1225. } else {
  1226. return false;
  1227. }
  1228. },
  1229. },
  1230. data() {
  1231. return {
  1232. rules: {
  1233. outwardStaff: [
  1234. { required: true, message: '外业人员不能为空', trigger: 'blur' },
  1235. ],
  1236. },
  1237. workflowLogs: [],
  1238. activeName: null,
  1239. activeTagName: null,
  1240. nodeBusinessInfo: {
  1241. currentNodePermission: {
  1242. commit: true,
  1243. reversible: true,
  1244. restartable: true,
  1245. terminable: true,
  1246. skippable: true,
  1247. },
  1248. mainBusiness: "PERSONAL_BUSINESS",
  1249. doWorkflow: false,
  1250. businessId: null,
  1251. currentNodeInstanceId: null,
  1252. currentNodeInstanceCode: null,
  1253. production: [],
  1254. businessSubId: null,
  1255. ifFeedback: null,
  1256. ccId: null
  1257. },
  1258. currentNode: {
  1259. flowId: null,
  1260. pnodeId: null,
  1261. nodeId: null,
  1262. flowCode: null,
  1263. nodeName: "",
  1264. nodeCode: null,
  1265. state: "",
  1266. instanceId: null,
  1267. sequence: null,
  1268. restartable: null,
  1269. reversible: null,
  1270. skippable: null,
  1271. terminable: null,
  1272. tasks: []
  1273. },
  1274. personal: {
  1275. id: null,
  1276. clientManagerId: null,
  1277. clientManager: null,
  1278. evaluateAim: null,
  1279. purpose: [],
  1280. location: null,
  1281. clienteleType: null,
  1282. clienteleId: null,
  1283. cclienteleName: null,
  1284. cclienteleSubName: null,
  1285. agent: null,
  1286. cclienteleContactName: null,
  1287. cmobile: null,
  1288. cdepartment: null,
  1289. cduty: null,
  1290. loanNature: null,
  1291. loanAim: null,
  1292. loanLimit: null,
  1293. loanPeriod: null,
  1294. loanExpire: false,
  1295. credentials: [],
  1296. bailorA: null,
  1297. bailorATel: null,
  1298. bailorB: null,
  1299. bailorBTel: null,
  1300. terminalClienteleType: null,
  1301. tterminalClienteleName: null,
  1302. tterminalClienteleContactName: null,
  1303. tmobile: null,
  1304. remark: null,
  1305. inwardStaffName: null,
  1306. outwardStaff: null,
  1307. outwardStaffName: null,
  1308. pricingStaffName: null,
  1309. inwardStaffName: null,
  1310. },
  1311. outwardStaffs: [],
  1312. outwardStaffTip: true,
  1313. certificateName: null,
  1314. otherInfo: 'entityInfo',
  1315. certificateInfo: null,
  1316. target: {
  1317. id: null,
  1318. personalId: null,
  1319. location: null,
  1320. bailorA: null,
  1321. bailorB: null,
  1322. acreage: null,
  1323. amount: null,
  1324. price: null,
  1325. isOnline: null,
  1326. feedback: null,
  1327. houseCertificate: null,
  1328. landCertificate: null,
  1329. immovableCertificate: null,
  1330. entityInfo: null,
  1331. backgroundInfo: null,
  1332. sellingAbility: null,
  1333. sellMoney: null,
  1334. sellMoneyBase: null,
  1335. sellMoneyRate: null,
  1336. validateCode:null
  1337. },
  1338. compareList: {
  1339. targetId: null,
  1340. calculateId: null,
  1341. fixValue: 1,
  1342. rightsType: 'SELL',
  1343. rollingLevel: 1,
  1344. calculateType: 'SIMPLE',
  1345. method: 'COMPARE',
  1346. analysisData: [
  1347. {
  1348. "sorted": null,
  1349. "index": "坐落",
  1350. "compareA": { valueA: null },
  1351. "compareB": { valueA: null },
  1352. "compareC": { valueA: null },
  1353. "target": { valueA: null },
  1354. },
  1355. {
  1356. "sorted": null,
  1357. "index": "总价(元)",
  1358. "compareA": { valueA: null },
  1359. "compareB": { valueA: null },
  1360. "compareC": { valueA: null },
  1361. "target": { valueA: null },
  1362. },
  1363. {
  1364. "sorted": null,
  1365. "index": "单价(元)",
  1366. "compareA": { valueA: null },
  1367. "compareB": { valueA: null },
  1368. "compareC": { valueA: null },
  1369. "target": { valueA: null },
  1370. },
  1371. {
  1372. "sorted": null,
  1373. "index": "市场状况",
  1374. "compareA": { valueA: null, weight: 100 },
  1375. "compareB": { valueA: null, weight: 100 },
  1376. "compareC": { valueA: null, weight: 100 },
  1377. "target": { valueA: null, weight: 100 },
  1378. },
  1379. {
  1380. "sorted": null,
  1381. "index": "所在楼栋",
  1382. "compareA": { valueA: '对中庭', weight: 100 },
  1383. "compareB": { valueA: '对中庭', weight: 100 },
  1384. "compareC": { valueA: '对中庭', weight: 100 },
  1385. "target": { valueA: '对中庭', weight: 100 },
  1386. },
  1387. {
  1388. "sorted": null,
  1389. "index": "建筑面积(平)",
  1390. "compareA": { valueA: 0, weight: 100 },
  1391. "compareB": { valueA: 0, weight: 100 },
  1392. "compareC": { valueA: 0, weight: 100 },
  1393. "target": { valueA: 0, weight: 100 },
  1394. },
  1395. {
  1396. "sorted": null,
  1397. "index": "楼层/总楼层",
  1398. "compareA": { valueA: null, valueb: null, weight: 100 },
  1399. "compareB": { valueA: null, valueb: null, weight: 100 },
  1400. "compareC": { valueA: null, valueb: null, weight: 100 },
  1401. "target": { valueA: null, valueb: null, weight: 100 },
  1402. },
  1403. {
  1404. "sorted": null,
  1405. "index": "户型",
  1406. "compareA": { valueA: null, weight: 100 },
  1407. "compareB": { valueA: null, weight: 100 },
  1408. "compareC": { valueA: null, weight: 100 },
  1409. "target": { valueA: null, weight: 100 },
  1410. },
  1411. {
  1412. "sorted": null,
  1413. "index": "室内装饰",
  1414. "compareA": { valueA: '精装', weight: 100 },
  1415. "compareB": { valueA: '精装', weight: 100 },
  1416. "compareC": { valueA: '精装', weight: 100 },
  1417. "target": { valueA: '精装', weight: 100 },
  1418. },
  1419. {
  1420. "sorted": null,
  1421. "index": "其他",
  1422. "compareA": { valueA: null, weight: 100 },
  1423. "compareB": { valueA: null, weight: 100 },
  1424. "compareC": { valueA: null, weight: 100 },
  1425. "target": { valueA: null, weight: 100 },
  1426. },
  1427. {
  1428. "sorted": null,
  1429. "index": "修正后价格",
  1430. "compareA": { valueA: null },
  1431. "compareB": { valueA: null },
  1432. "compareC": { valueA: null },
  1433. "target": { valueA: null },
  1434. }
  1435. ],
  1436. price: null,
  1437. amount: null,
  1438. acreage: null,
  1439. sellMoney: null,
  1440. sellMoneyBase: null,
  1441. sellMoneyRate: null
  1442. },
  1443. needWeight: ['所在楼栋', '建筑面积(平)', '户型', '其他'],
  1444. requiredIndex: ['单价(元)', '坐落', '市场状况', '所在楼栋', '建筑面积(平)', '户型', '室内装饰', '楼层/总楼层', '权重'],
  1445. calculateWeight: {
  1446. "sorted": null,
  1447. "index": "权重",
  1448. "compareA": { valueA: null },
  1449. "compareB": { valueA: null },
  1450. "compareC": { valueA: null },
  1451. "target": { valueA: null },
  1452. },
  1453. calculating: false,
  1454. decideProductionTypeDialog: false,
  1455. linkAttributes: {
  1456. location: null,
  1457. bailor1: null,
  1458. bailor1Tel: null,
  1459. bailor2: null,
  1460. bailor2Tel: null,
  1461. acreage: null,
  1462. allFloor: null,
  1463. purpose: null,
  1464. ownerName: null,
  1465. atFloor: null
  1466. },
  1467. statementProd: {
  1468. id: null,
  1469. targetId: null,
  1470. files: [],
  1471. created: null,
  1472. checkState: null,
  1473. isOnline:null
  1474. },
  1475. technicReportProd: {
  1476. id: null,
  1477. targetId: null,
  1478. files: [],
  1479. created: null,
  1480. checkState: null
  1481. },
  1482. finalReprotProd: {
  1483. id: null,
  1484. targetId: null,
  1485. files: [],
  1486. created: null,
  1487. checkState: null
  1488. },
  1489. letterReprotProd: {
  1490. id: null,
  1491. targetId: null,
  1492. files: [],
  1493. created: null,
  1494. checkSatae: null
  1495. },
  1496. statementCardPNG: emptyPNG,
  1497. technicCardPNG: emptyPNG,
  1498. finalCardPNG: emptyPNG,
  1499. letterCardPNG: emptyPNG,
  1500. outWarehouseDialog: false,
  1501. inWarehouseDialog: false,
  1502. warehouseTip: null,
  1503. productionId: null,
  1504. hasStatement: false,
  1505. hasReport: false,
  1506. hasLetter: false,
  1507. feedback: null,
  1508. checkDialog: false,
  1509. checkProDTO: {
  1510. targetId: null,
  1511. production: null
  1512. },
  1513. showProds: true,
  1514. sceneForm:{
  1515. id:null,
  1516. personalId:null,
  1517. inRingDewlling:null,
  1518. outRingDewlling:null,
  1519. inRingBuilding:null,
  1520. outRingBuilding:null,
  1521. remark:null
  1522. },
  1523. houseShow:false,
  1524. immovalbeShow:false,
  1525. landShow:false,
  1526. changeCredentials:[]
  1527. }
  1528. },
  1529. created() {
  1530. this.personalId = this.$route.query.id;
  1531. this.businessSubId = this.$route.query.orderId;
  1532. this.isOnline = this.$route.query.isOnline==='true';
  1533. this.nodeBusinessInfo.currentNodeInstanceCode = this.$route.query.currentNodeCode;
  1534. this.nodeBusinessInfo.doWorkflow = this.$route.query.doWorkflow === 'true';
  1535. this.nodeBusinessInfo.businessId = this.$route.query.id;
  1536. this.nodeBusinessInfo.businessSubId = this.$route.query.orderId;
  1537. this.activeTagName = this.jumpTabs();
  1538. this.getPersonalTarget();
  1539. this.getPersonal();
  1540. this.getOutWardStaffList();
  1541. this.getWorkflowLogs();
  1542. this.getCurrentNodeInfo();
  1543. this.getProductions();
  1544. this.getScene();
  1545. },
  1546. methods: {
  1547. getPersonal() {
  1548. if (this.personalId) {
  1549. this.$api.personal.detail(this.personalId).then(res => {
  1550. if (res.code === 200) {
  1551. res.data.credentials = JSON.parse(res.data.credentials);
  1552. res.data.purpose = JSON.parse(res.data.purpose);
  1553. this.personal = res.data;
  1554. this.linkAttributes.location = this.personal.location;
  1555. this.linkAttributes.bailor1 = this.personal.bailorA;
  1556. this.linkAttributes.bailor1Tel = this.personal.bailoraTel;
  1557. this.linkAttributes.bailor2 = this.personal.bailorB;
  1558. this.linkAttributes.bailor2Tel = this.personal.bailorbTel;
  1559. this.linkAttributes.purpose = this.personal.purpose;
  1560. if (this.personal.evaluateAim === '抵押') {
  1561. this.linkAttributes.ownerName = this.personal.bailorA;
  1562. }
  1563. this.nodeBusinessInfo.ccId = this.personal.clienteleId;
  1564. }
  1565. })
  1566. }
  1567. },
  1568. getPersonalTarget() {
  1569. if (this.personalId) {
  1570. this.$api.personalTarget.detail(this.personalId).then(res => {
  1571. if (res.code === 200) {
  1572. this.target = res.data;
  1573. this.linkAttributes.acreage = this.target.acreage;
  1574. if (res.data.isOnline) {
  1575. this.getCaluateTable(res.data.id)
  1576. }
  1577. if (res.data.houseCertificate) {
  1578. this.target.houseCertificate = JSON.parse(res.data.houseCertificate);
  1579. }
  1580. if (res.data.landCertificate) {
  1581. this.target.landCertificate = JSON.parse(res.data.landCertificate);
  1582. }
  1583. if (res.data.immovableCertificate) {
  1584. this.target.immovableCertificate = JSON.parse(res.data.immovableCertificate);
  1585. }
  1586. if (res.data.entityInfo) {
  1587. this.target.entityInfo = JSON.parse(res.data.entityInfo);
  1588. }
  1589. if (res.data.backgroundInfo) {
  1590. this.target.backgroundInfo = JSON.parse(res.data.backgroundInfo);
  1591. }
  1592. if (res.data.sellingAbility) {
  1593. this.target.sellingAbility = JSON.parse(res.data.sellingAbility);
  1594. }
  1595. if (res.data.feedback) {
  1596. this.feedback = JSON.parse(res.data.feedback);
  1597. this.nodeBusinessInfo.production = this.feedback;
  1598. } else {
  1599. this.feedback = []
  1600. }
  1601. }
  1602. })
  1603. }
  1604. },
  1605. getCurrentNodeInfo() {
  1606. if (this.personalId) {
  1607. this.$api.workNodeInstance.currentNode({ "mainBusiness": "PERSONAL_BUSINESS", "businessId": this.personalId, "businessSubId": this.businessSubId }).then(res => {
  1608. if (res.code === 200) {
  1609. if (res.data) {
  1610. this.currentNode = res.data;
  1611. this.nodeBusinessInfo.currentInstanceNodeId = res.data.instanceId;
  1612. this.nodeBusinessInfo.currentNodeInstanceCode = res.data.nodeCode;
  1613. this.nodeBusinessInfo.currentNodePermission.restartable = res.data.restartable;
  1614. this.nodeBusinessInfo.currentNodePermission.reversible = res.data.reversible;
  1615. this.nodeBusinessInfo.currentNodePermission.skippable = res.data.skippable;
  1616. this.nodeBusinessInfo.currentNodePermission.terminable = res.data.terminable;
  1617. }
  1618. }
  1619. })
  1620. }
  1621. },
  1622. handleClick(tab) {
  1623. if ("producution" === tab && this.feedback == null) {
  1624. this.feedback = [];
  1625. }
  1626. if ("scene" === tab){
  1627. this.getScene();
  1628. }
  1629. },
  1630. getWorkflowLogs() {
  1631. let param = {
  1632. businessId: this.personalId,
  1633. businessType: 'PERSONAL_BUSINESS',
  1634. businessSubId: this.businessSubId
  1635. }
  1636. this.$api.workflowLog.list(param).then(res => {
  1637. if (res.code === 200) {
  1638. this.workflowLogs = res.data;
  1639. }
  1640. })
  1641. },
  1642. workflowCommitVerify(val, callback) {
  1643. let commit = val.commit;
  1644. let verify = new Object();
  1645. verify.state = true;
  1646. verify.productionType = this.feedback;
  1647. if (commit.state === 'PASS') {
  1648. let nodeCode = this.nodeBusinessInfo.currentNodeInstanceCode
  1649. switch (nodeCode) {
  1650. case 'DEPARTMENT_ALLOCATION':
  1651. if (!this.personal.outwardStaff) {
  1652. this.$message('请确定外业人员后,再提交流程。')
  1653. verify.state = false;
  1654. } else {
  1655. verify.nextHandlerId = this.personal.outwardStaff;
  1656. }
  1657. callback(verify);
  1658. return;
  1659. case "DETERMINE_PRICE":
  1660. if (!this.target.feedback) {
  1661. verify.state = false;
  1662. callback(verify);
  1663. this.decideProductionTypeDialog = true
  1664. return;
  1665. } else {
  1666. callback(verify);
  1667. return;
  1668. }
  1669. case "GENERATE_STATEMENT":
  1670. case "WRITE_REPORT":
  1671. case "WRITE_LETTER":
  1672. if (this.isOnline) {
  1673. let ok = true;
  1674. this.personal.credentials.forEach(item=>{
  1675. if (item=== 'HOUSE_CERTIFICATE' && !this.target.houseCertificate){
  1676. this.$notify({
  1677. title: '提示',
  1678. message: '请先完成房产证信息录入再提交,否则请切换为线下流程。',
  1679. type: 'error',
  1680. duration: 2000
  1681. });
  1682. ok = false;
  1683. }
  1684. if (item=== 'LAND_CERTIFICATE' && !this.target.landCertificate){
  1685. this.$notify({
  1686. title: '提示',
  1687. message: '请先完成国土证信息录入再提交,否则请切换为线下流程。',
  1688. type: 'error',
  1689. duration: 2000
  1690. });
  1691. ok = false;
  1692. }
  1693. if (item=== 'IMMOVABLE_CERTIFICATE' && !this.target.immovableCertificate ){
  1694. this.$notify({
  1695. title: '提示',
  1696. message: '请先完成不动产权证信息录入再提交,否则请切换为线下流程。',
  1697. type: 'error',
  1698. duration: 2000
  1699. });
  1700. ok = false;
  1701. }
  1702. })
  1703. if (ok && nodeCode === 'GENERATE_STATEMENT' && (this.statementProd == null || this.statementProd.files.length === 0)) {
  1704. this.$notify({
  1705. title: '提示',
  1706. message: '请生成意见书,再提交流程',
  1707. type: 'error',
  1708. duration: 2000
  1709. });
  1710. }
  1711. if (ok && nodeCode === 'WRITE_REPORT' && (this.technicReportProd == null || this.technicReportProd.files.length === 0)) {
  1712. this.$notify({
  1713. title: '提示',
  1714. message: '请生成报告,再提交流程',
  1715. type: 'error',
  1716. duration: 2000
  1717. });
  1718. }
  1719. if (ok && nodeCode === 'WRITE_LETTER' && (this.letterReprotProd == null || this.letterReprotProd.files.length === 0)) {
  1720. this.$notify({
  1721. title: '提示',
  1722. message: '请生成复评函,再提交流程',
  1723. type: 'error',
  1724. duration: 2000
  1725. });
  1726. }
  1727. verify.state = false;
  1728. }
  1729. callback(verify);
  1730. return;
  1731. case "REVIEW_STATEMENT":
  1732. if (this.statementProd==null || this.statementProd.checkState === '待审核') {
  1733. verify.state = false;
  1734. callback(verify);
  1735. this.checkProDTO.production = "STATEMENT";
  1736. this.checkProDTO.targetId = this.target.id;
  1737. this.checkDialog = true
  1738. return;
  1739. }
  1740. callback(verify);
  1741. case "CHECK_REPORT":
  1742. if (this.technicReportProd.checkState==null || this.finalReprotProd.checkState==null ||
  1743. this.technicReportProd.checkState === '待审核' || this.finalReprotProd.checkState === '待审核') {
  1744. verify.state = false;
  1745. callback(verify);
  1746. this.checkProDTO.production = "REPORT";
  1747. this.checkProDTO.targetId = this.target.id;
  1748. this.checkDialog = true
  1749. return;
  1750. }
  1751. callback(verify);
  1752. return;
  1753. case "CHECK_LETTER":
  1754. if (!this.letterReprotProd.checkState) {
  1755. verify.state = false;
  1756. callback(verify);
  1757. this.checkProDTO.production = "LETTER";
  1758. this.checkProDTO.targetId = this.target.id;
  1759. this.checkDialog = true
  1760. return;
  1761. }
  1762. callback(verify);
  1763. return;
  1764. case "QUOTATION_FEEDBACK":
  1765. if (this.feedback.length!=1){
  1766. verify.state = false;
  1767. callback(verify);
  1768. this.$message("还没有确定产品类型");
  1769. return;
  1770. }
  1771. callback(verify);
  1772. return;
  1773. case "STATEMENT_FEEDBACK":
  1774. if (this.feedback.length!=2){
  1775. verify.state = false;
  1776. callback(verify);
  1777. this.$message("意见书送达后,还没有确定后续产品类型。");
  1778. return;
  1779. }
  1780. callback(verify);
  1781. return;
  1782. }
  1783. }
  1784. },
  1785. handleChange(tab) {
  1786. if (this.outwardStaffTip) {
  1787. this.outwardStaffTip = false;
  1788. }
  1789. },
  1790. goBack() {
  1791. const back = this.$route.query.back
  1792. if (back) {
  1793. this.$router.push(back)
  1794. }
  1795. },
  1796. getOutWardStaffList() {
  1797. this.$api.user.postUser("个贷外业岗").then(res => {
  1798. if (res.code === 200) {
  1799. this.outwardStaffs = res.data;
  1800. }
  1801. })
  1802. },
  1803. saveOutwardStaff() {
  1804. this.$refs.personalMemberForm.validate(valid => {
  1805. if (valid) {
  1806. if (this.personal.id) {
  1807. const personalMember = new Object();
  1808. personalMember.id = this.personal.id;
  1809. personalMember.outwardStaff = this.personal.outwardStaff
  1810. const taskRecordDTO = this.buildTaskRecordDTO(personalMember);
  1811. this.$api.personal.allotOutward(taskRecordDTO).then(res => {
  1812. if (res.code === 200 && res.data) {
  1813. this.$notify({
  1814. title: '成功',
  1815. message: '保存成功,请提交节点继续流程。',
  1816. type: 'success',
  1817. duration: 2000
  1818. });
  1819. } else {
  1820. this.$notify({
  1821. title: '失败',
  1822. message: '保存失败,请提联系系统管理员',
  1823. type: 'success',
  1824. duration: 2000
  1825. });
  1826. }
  1827. })
  1828. }
  1829. }
  1830. })
  1831. },
  1832. //构建任务处理对象
  1833. buildTaskRecordDTO(data) {
  1834. const taskRecordDTO = new Object();
  1835. taskRecordDTO.recordId = this.currentNode.tasks[0].recordId;
  1836. taskRecordDTO.taskData = data;
  1837. return taskRecordDTO;
  1838. },
  1839. //提交节点
  1840. commit(state) {
  1841. this.$refs.board.commit(state);
  1842. },
  1843. jumpTabs() {
  1844. const orderTag = ['OPENING_ORDER', 'DEPARTMENT_ALLOCATION'];
  1845. const evaluate = ['DETERMINE_PRICE','REVIEW_STATEMENT','CHECK_REPORT','CHECK_LETTER'];
  1846. const certificates = ['GENERATE_STATEMENT', 'WRITE_REPORT', 'WRITE_LETTER']
  1847. const scenesTag = ['SPOT_RECONNAISSANCE']
  1848. const nodeCode = this.$route.query.currentNodeCode;
  1849. if (orderTag.includes(nodeCode)) {
  1850. return 'order';
  1851. }
  1852. if (evaluate.includes(nodeCode)) {
  1853. return 'evaluate'
  1854. }
  1855. if (certificates.includes(nodeCode) && this.isOnline) {
  1856. return 'certificateInfo';
  1857. }
  1858. if (this.feedback == null) {
  1859. this.feedback = [];
  1860. }
  1861. if (scenesTag.includes(nodeCode)){
  1862. return 'scene';
  1863. }
  1864. return 'producution'
  1865. },
  1866. calulate() {
  1867. this.calculating = true;
  1868. this.$refs.compareToForm.validate(valid => {
  1869. if (valid) {
  1870. if (validateParams(this.compareList.analysisData)) {
  1871. this.compareList = calculateTargetPrice(this.compareList);
  1872. }
  1873. }
  1874. })
  1875. setTimeout(() => {
  1876. this.calculating = false;
  1877. }, 500)
  1878. },
  1879. saveCalulateResult() {
  1880. this.target.amount = this.compareList.amount;
  1881. this.target.price = this.compareList.price;
  1882. this.target.acreage = this.compareList.acreage;
  1883. this.compareList.targetId = this.target.id;
  1884. this.target.sellMoneyRate = this.compareList.sellMoneyRate;
  1885. this.target.sellMoney = this.compareList.sellMoney;
  1886. this.target.sellMoneyBase = this.compareList.sellMoneyBase;
  1887. let taskRecord = this.buildTaskRecordDTO(this.compareList);
  1888. this.$api.personalCalculate.calculate(taskRecord).then(res => {
  1889. if (res.code === 200 && res.data) {
  1890. this.getCaluateTable(this.target.id);
  1891. this.$notify({
  1892. title: '成功',
  1893. message: '保存成功',
  1894. type: 'success',
  1895. duration: 2000
  1896. });
  1897. } else {
  1898. this.$notify({
  1899. title: '失败',
  1900. message: '保存失败',
  1901. type: 'error',
  1902. duration: 2000
  1903. });
  1904. }
  1905. })
  1906. },
  1907. savePrice() {
  1908. this.$refs.targetForm.validate(valid => {
  1909. if (valid) {
  1910. this.target.location = this.personal.location;
  1911. this.target.bailorA = this.personal.bailorA;
  1912. this.target.bailorB = this.personal.bailorB;
  1913. let taskRecord = this.buildTaskRecordDTO(this.target);
  1914. this.$api.personalTarget.price(taskRecord).then(res => {
  1915. if (res.code === 200 && res.data) {
  1916. this.$notify({
  1917. title: '成功',
  1918. message: '保存成功',
  1919. type: 'success',
  1920. duration: 2000
  1921. });
  1922. } else {
  1923. this.$notify({
  1924. title: '失败',
  1925. message: '保存失败',
  1926. type: 'error',
  1927. duration: 2000
  1928. });
  1929. }
  1930. })
  1931. }
  1932. })
  1933. },
  1934. getCaluateTable(targetId) {
  1935. if (targetId) {
  1936. this.$api.personalCalculate.getResult(targetId).then(res => {
  1937. if (res.code === 200 && res.data) {
  1938. this.compareList = res.data;
  1939. this.linkAttributes.allFloor = this.compareList.analysisData[6].target.valueB;
  1940. this.linkAttributes.atFloor = this.compareList.analysisData[6].target.valueA;
  1941. this.linkAttributes.houseType = this.compareList.analysisData[7].target.valueA;
  1942. this.selectCalculateType();
  1943. }
  1944. })
  1945. }
  1946. },
  1947. calculateSwith() {
  1948. this.$api.personalTarget.calculateSwith(this.target.isOnline, this.target.id).then(res=>{
  1949. if (res.code === 200 && res.data){
  1950. this.isOnline = this.target.isOnline;
  1951. }
  1952. })
  1953. if (this.target.isOnline && !this.compareList.calculateId) {
  1954. this.getCaluateTable(this.target.id);
  1955. }
  1956. },
  1957. selectCalculateType() {
  1958. let data = this.compareList.analysisData
  1959. if (this.compareList.calculateType === 'SIMPLE') {
  1960. let dataX = data.filter(function (item) {
  1961. return item.index != '权重'
  1962. })
  1963. this.compareList.analysisData = dataX;
  1964. } else {
  1965. if (!data.map(item => item.index).includes("权重")) {
  1966. data.splice(10, 0, this.calculateWeight)
  1967. }
  1968. }
  1969. },
  1970. saveFeedbackWhenPrice() {
  1971. this.nodeBusinessInfo.ifFeedback = true;
  1972. if (this.target.id && this.target.feedback && this.target.feedback != 'NONE') {
  1973. this.nodeBusinessInfo.ifFeedback = false;
  1974. const feedbackReq = new Object();
  1975. feedbackReq.feedback = this.target.feedback;
  1976. feedbackReq.id = this.target.id;
  1977. this.$api.personalTarget.feedback(feedbackReq);
  1978. }
  1979. this.decideProductionTypeDialog = false;
  1980. this.commit("PASS");
  1981. },
  1982. genProductionFile(tag) {
  1983. const certificates = this.personal.credentials
  1984. for (let i in certificates) {
  1985. if (certificates[i] === 'HOUSE_CERTIFICATE' && !this.target.houseCertificate) {
  1986. this.$message('房产证未点击保存');
  1987. return;
  1988. }
  1989. if (certificates[i] === 'LAND_CERTIFICATE' && !this.target.landCertificate) {
  1990. this.$message('国土证未点击保存');
  1991. return;
  1992. }
  1993. if (certificates[i] === 'IMMOVABLE_CERTIFICATE' && !this.target.immovableCertificate) {
  1994. this.$message('不动产权证未点击保存');
  1995. return;
  1996. }
  1997. }
  1998. if (!this.target.entityInfo) {
  1999. this.$message('实物状况未点击保存');
  2000. return;
  2001. }
  2002. if (!this.target.backgroundInfo) {
  2003. this.$message('区位状况未点击保存');
  2004. return;
  2005. }
  2006. if (!this.target.sellingAbility) {
  2007. this.$message('变现能力未点击保存');
  2008. return;
  2009. }
  2010. this.$confirm('系统生成将会覆盖原有文档,请确认是否继续?', '提示', {
  2011. confirmButtonText: '确认',
  2012. cancelButtonText: '取消',
  2013. type: 'warning',
  2014. center: true
  2015. }).then(() => {
  2016. if (this.personal.id && this.target.id) {
  2017. this.$api.personalProduction.genFile(this.personal.id, tag).then(res => {
  2018. if (res.code === 200 && res.data) {
  2019. this.$notify({
  2020. title: '成功',
  2021. message: '生成文档成功',
  2022. type: 'success',
  2023. duration: 2000
  2024. });
  2025. this.getProductions();
  2026. this.getPersonalTarget();
  2027. } else {
  2028. this.$notify({
  2029. title: '失败',
  2030. message: '生成文档失败',
  2031. type: 'error',
  2032. duration: 2000
  2033. });
  2034. }
  2035. })
  2036. }
  2037. })
  2038. },
  2039. getProductions() {
  2040. if (this.target.id) {
  2041. this.$api.personalProduction.getProductions(this.target.id).then(res => {
  2042. if (res.code === 200) {
  2043. const words = res.data
  2044. words.forEach(word => {
  2045. if (word.production === 'STATEMENT') {
  2046. this.statementProd = word;
  2047. const fs = [];
  2048. if (word.filePath) {
  2049. this.statementCardPNG = existPNG;
  2050. const sta = JSON.parse(word.filePath)
  2051. sta.id = word.id;
  2052. fs.push(sta);
  2053. } else {
  2054. this.statementCardPNG = emptyPNG;
  2055. }
  2056. this.statementProd.files = fs;
  2057. }
  2058. if (word.production === 'TECHNIC') {
  2059. this.technicReportProd = word;
  2060. const fs = [];
  2061. if (word.filePath) {
  2062. const tec = JSON.parse(word.filePath)
  2063. tec.id = word.id;
  2064. this.technicCardPNG = existPNG;
  2065. fs.push(tec);
  2066. } else {
  2067. this.technicCardPNG = emptyPNG;
  2068. }
  2069. this.technicReportProd.files = fs;
  2070. }
  2071. if (word.production === 'FINAL') {
  2072. this.finalReprotProd = word;
  2073. const fs = [];
  2074. if (word.filePath) {
  2075. const final = JSON.parse(word.filePath)
  2076. final.id = word.id;
  2077. this.finalCardPNG = existPNG;
  2078. fs.push(final);
  2079. } else {
  2080. this.finalCardPNG = emptyPNG;
  2081. }
  2082. this.finalReprotProd.files = fs;
  2083. }
  2084. });
  2085. }
  2086. })
  2087. }
  2088. },
  2089. handleExceed(files, fileList) {
  2090. this.$message(`当前限制选择 1个文件,本次选择了 ${files.length} 个文件`);
  2091. },
  2092. handleAttachmentPreview(file) {
  2093. // window.open(file.url)
  2094. this.officeFileView(file.name,file.response.data.url);
  2095. },
  2096. handleRemoveFile(file, fileList) {
  2097. this.$confirm('请确认是否移除已存在的报告?', '提示', {
  2098. confirmButtonText: '确定',
  2099. cancelButtonText: '取消',
  2100. type: 'warning',
  2101. center: true
  2102. }).then(() => {
  2103. let pid = file.id;
  2104. if (pid) {
  2105. this.$api.personalProduction.removeFile(pid).then(res => {
  2106. if (res.code === 200 && res.data) {
  2107. this.$notify({
  2108. title: '成功',
  2109. message: '文档移除成功',
  2110. type: 'success',
  2111. duration: 2000
  2112. });
  2113. this.getProductions();
  2114. }
  2115. })
  2116. }
  2117. })
  2118. },
  2119. selectRoll() {
  2120. let roll = this.compareList.rollingLevel;
  2121. this.compareList.sellMoneyRate = 0.01;
  2122. if (roll === 1) {
  2123. this.compareList.sellMoneyBase = 12000;
  2124. this.compareList.sellMoney = 12000 * 0.01;
  2125. } else if (roll === 2) {
  2126. this.compareList.sellMoneyBase = 10800;
  2127. this.compareList.sellMoney = 10800 * 0.01;
  2128. } else {
  2129. this.compareList.sellMoneyBase = 10100;
  2130. this.compareList.sellMoney = 10100 * 0.01;
  2131. }
  2132. },
  2133. selectRightsType() {
  2134. if (this.compareList.rightsType === 'SELL') {
  2135. this.compareList.sellMoneyRate = null;
  2136. this.compareList.sellMoneyBase = null;
  2137. this.compareList.sellMoney = null;
  2138. this.target.sellMoneyRate = null;
  2139. this.target.sellMoneyBase = null;
  2140. this.target.sellMoney = null;
  2141. } else {
  2142. this.selectRoll();
  2143. }
  2144. },
  2145. downloadPkg() {
  2146. if (this.target.id) {
  2147. this.$api.personalProduction.downloadPkg(this.target.id);
  2148. }
  2149. },
  2150. doStamp(files) {
  2151. const file = files[0];
  2152. if (file) {
  2153. this.$api.businessProduction.doStamp(file).then(res => {
  2154. if (res.code === 200 && res.data) {
  2155. this.$notify({
  2156. title: '成功',
  2157. message: '加盖公章成功',
  2158. type: 'success',
  2159. duration: 2000
  2160. });
  2161. } else {
  2162. this.$notify({
  2163. title: '失败',
  2164. message: '加盖公章失败',
  2165. type: 'error',
  2166. duration: 2000
  2167. });
  2168. }
  2169. })
  2170. } else {
  2171. this.$notify({
  2172. title: '失败',
  2173. message: '加盖公章失败,请先生成意见书或报告',
  2174. type: 'error',
  2175. duration: 2000
  2176. });
  2177. }
  2178. },
  2179. checkPass() {
  2180. if (this.checkProDTO.targetId && this.checkProDTO.production) {
  2181. const taskRecordDTO = this.buildTaskRecordDTO(this.checkProDTO);
  2182. this.$api.personalProduction.checkPass(taskRecordDTO).then(res => {
  2183. if (res.code === 200 && res.data) {
  2184. this.$notify({
  2185. title: '成功',
  2186. message: '审核成功',
  2187. type: 'success',
  2188. duration: 2000
  2189. });
  2190. const prodType = this.checkProDTO.production;
  2191. if (prodType === 'REPORT') {
  2192. this.technicReportProd.checkState = '已审核';
  2193. this.finalReprotProd.checkState = '已审核';
  2194. }
  2195. if (prodType === 'STATEMENT') {
  2196. this.statementProd.checkState = '已审核';
  2197. }
  2198. if (prodType === 'LETTER') {
  2199. this.letterReprotProd.checkState = '已审核';
  2200. }
  2201. this.commit("PASS");
  2202. } else {
  2203. this.$notify({
  2204. title: '失败',
  2205. message: '审核失败',
  2206. type: 'error',
  2207. duration: 2000
  2208. });
  2209. }
  2210. this.checkDialog = false;
  2211. })
  2212. }
  2213. },
  2214. warehouse() {
  2215. const code = this.currentNode.nodeCode;
  2216. if (code === 'STATEMENT_IN') {
  2217. const orderId = this.personal.orderId
  2218. this.warehouseTip = "请确认将项目编号为[" + orderId + "]的意见书入库?";
  2219. this.checkProDTO.production = "STATEMENT";
  2220. this.checkProDTO.targetId = this.target.id;
  2221. this.inWarehouseDialog = true;
  2222. }
  2223. const orderId = this.personal.orderId
  2224. if (code === 'STATEMENT_OUT') {
  2225. this.warehouseTip = "请确认将项目编号为[" + orderId + "]的意见书出库?";
  2226. this.checkProDTO.production = "STATEMENT";
  2227. this.checkProDTO.targetId = this.target.id;
  2228. this.outWarehouseDialog = true;
  2229. }
  2230. if (code === 'REPORT_IN') {
  2231. this.warehouseTip = "请确认将项目编号为[" + orderId + "]的报告入库?";
  2232. this.checkProDTO.production = "REPORT";
  2233. this.checkProDTO.targetId = this.target.id;
  2234. this.inWarehouseDialog = true;
  2235. }
  2236. if (code === 'REPORT_OUT') {
  2237. this.warehouseTip = "请确认将项目编号为[" + orderId + "]的报告出库?";
  2238. this.checkProDTO.production = "REPORT";
  2239. this.checkProDTO.targetId = this.target.id;
  2240. this.outWarehouseDialog = true;
  2241. }
  2242. },
  2243. doInWareHouse() {
  2244. if (this.checkProDTO.targetId && this.checkProDTO.production) {
  2245. let taskRecordDTO = this.buildTaskRecordDTO(this.checkProDTO);
  2246. this.$api.personalProduction.inWareHouse(taskRecordDTO).then(res => {
  2247. if (res.code === 200 && res.data) {
  2248. this.$notify({
  2249. title: '成功',
  2250. message: '入库操作成功',
  2251. type: 'success',
  2252. duration: 2000
  2253. });
  2254. } else {
  2255. this.$notify({
  2256. title: '失败',
  2257. message: '入库操作失败',
  2258. type: 'error',
  2259. duration: 2000
  2260. });
  2261. }
  2262. })
  2263. }
  2264. this.inWarehouseDialog = false;
  2265. },
  2266. doOutWareHouse() {
  2267. if (this.checkProDTO.targetId && this.checkProDTO.production) {
  2268. let taskRecordDTO = this.buildTaskRecordDTO(this.checkProDTO);
  2269. this.$api.personalProduction.outWareHouse(taskRecordDTO).then(res => {
  2270. if (res.code === 200 && res.data) {
  2271. this.$notify({
  2272. title: '成功',
  2273. message: '出库操作成功',
  2274. type: 'success',
  2275. duration: 2000
  2276. });
  2277. } else {
  2278. this.$notify({
  2279. title: '失败',
  2280. message: '出库操作失败',
  2281. type: 'error',
  2282. duration: 2000
  2283. });
  2284. }
  2285. })
  2286. }
  2287. this.outWarehouseDialog = false;
  2288. },
  2289. saveFeedback() {
  2290. let flag = true;
  2291. const oldFeedback = JSON.parse(this.target.feedback);
  2292. if (oldFeedback) {
  2293. oldFeedback.forEach(element => {
  2294. if (!this.feedback.includes(element)) {
  2295. if (element === 'STATEMENT' && this.statementProd.id) {
  2296. this.$message("不能移除已存在的产品类型");
  2297. flag = false;
  2298. }
  2299. if (element === 'REPORT' && (this.technicReportProd.id || this.finalReprotProd.id)) {
  2300. this.$message("不能移除已存在的产品类型");
  2301. flag = false;
  2302. }
  2303. }
  2304. });
  2305. if (this.currentNode.nodeCode==='QUOTATION_FEEDBACK' && this.feedback.length>1){
  2306. this.$message("只能选择一种产品类型");
  2307. flag = false;
  2308. }
  2309. if (this.currentNode.nodeCode==='STATEMENT_FEEDBACK' && this.feedback.length>2){
  2310. this.$message("只能选择一种产品类型");
  2311. flag = false;
  2312. }
  2313. }
  2314. if (flag) {
  2315. const feedbackDTO = new Object();
  2316. feedbackDTO.id = this.target.id;
  2317. if (this.feedback.length==0){
  2318. return;
  2319. }
  2320. feedbackDTO.feedback = JSON.stringify(this.feedback);
  2321. const taskRecordDTO = this.buildTaskRecordDTO(feedbackDTO)
  2322. this.$api.personalTarget.doFeedback(taskRecordDTO).then(res => {
  2323. if (res.code === 200 && res.data) {
  2324. this.$notify({
  2325. title: '成功',
  2326. message: '反馈客户信息成功',
  2327. type: 'success',
  2328. duration: 2000
  2329. });
  2330. this.getPersonalTarget();
  2331. } else {
  2332. this.$notify({
  2333. title: '失败',
  2334. message: '反馈客户信息失败',
  2335. type: 'error',
  2336. duration: 2000
  2337. });
  2338. }
  2339. })
  2340. }else{
  2341. this.feedback = oldFeedback;
  2342. }
  2343. },
  2344. saveScene(){
  2345. this.$refs.sceneForm.validate((valid) => {
  2346. if (valid) {
  2347. if (this.sceneForm.id) {
  2348. const taskRecordDTO = this.buildTaskRecordDTO(this.sceneForm)
  2349. this.$api.personalScene.saveScene(taskRecordDTO).then(res => {
  2350. if (res.code === 200 && res.data) {
  2351. this.$notify({
  2352. title: '成功',
  2353. message: '实勘信息更新成功',
  2354. type: 'success',
  2355. duration: 2000
  2356. })
  2357. this.getScene();
  2358. }
  2359. })
  2360. }else{
  2361. this.sceneForm.personalId = this.personal.id;
  2362. const taskRecordDTO = this.buildTaskRecordDTO(this.sceneForm)
  2363. this.$api.personalScene.saveScene(taskRecordDTO).then(res => {
  2364. if (res.code === 200 && res.data) {
  2365. this.$notify({
  2366. title: '成功',
  2367. message: '实勘信息添加成功',
  2368. type: 'success',
  2369. duration: 2000
  2370. })
  2371. this.getScene();
  2372. }
  2373. })
  2374. }
  2375. }
  2376. })
  2377. },
  2378. getScene(){
  2379. this.$api.personalScene.getScene(this.personalId).then(res => {
  2380. if (res.code === 200 && res.data) {
  2381. this.sceneForm = res.data;
  2382. }
  2383. })
  2384. },
  2385. saveChangeCer(){
  2386. this.$confirm('是否确定需要换证。换证之后,已录入的证件信息将被清空。请确认?', '提示', {
  2387. confirmButtonText: '确定',
  2388. cancelButtonText: '取消',
  2389. type: 'warning'
  2390. }).then(()=>{
  2391. const personal = new Object();
  2392. personal.id = this.personal.id;
  2393. personal.credentials = JSON.stringify(this.changeCredentials);
  2394. this.$api.personal.changeCredentials(personal).then(res => {
  2395. if (res.code === 200) {
  2396. this.$notify({
  2397. title: '成功',
  2398. message: '换证成功',
  2399. type: 'success',
  2400. duration: 2000
  2401. });
  2402. this.getPersonal();
  2403. }
  2404. })
  2405. })
  2406. },
  2407. // 文档预览
  2408. officeFileView(name, url) {
  2409. const route = this.$router.resolve({
  2410. path: "/office/view/window",
  2411. query: {
  2412. // 文档标题
  2413. title: name,
  2414. // 文档url地址
  2415. url: url
  2416. }
  2417. });
  2418. // 在新窗口打开页面
  2419. window.open(route.href, "_blank");
  2420. },
  2421. printQR(){
  2422. const path = this.target.validateCode;
  2423. console.log(path)
  2424. if (!path){
  2425. this.$message("二维码还未生成,无法打印。")
  2426. return;
  2427. }
  2428. let routeUrl = this.$router.resolve({
  2429. path: `/print/code?path=${path}`
  2430. });
  2431. window.open(routeUrl.href, '_blank');
  2432. }
  2433. }
  2434. }
  2435. </script>
  2436. <style lang="scss" scoped>
  2437. .row-style {
  2438. margin-left: 40px;
  2439. margin-right: 1%;
  2440. }
  2441. .major-radio {
  2442. width: 92px
  2443. }
  2444. .task-class {
  2445. /deep/ .el-form-item__label {
  2446. color: red;
  2447. }
  2448. }
  2449. .evaluate-table {
  2450. margin-left: 40px;
  2451. margin-top: 35px;
  2452. }
  2453. .pane-class {
  2454. width: 100%;
  2455. overflow-y: scroll;
  2456. }
  2457. /deep/ .cell-class {
  2458. font-size: 13px;
  2459. color: black;
  2460. }
  2461. .table {
  2462. /deep/ thead {
  2463. .el-table-column--selection {
  2464. .cell {
  2465. display: none;
  2466. }
  2467. }
  2468. }
  2469. }
  2470. /deep/.doWarehouseClass {
  2471. border-radius: 10px;
  2472. }
  2473. .button-area {
  2474. position: absolute;
  2475. top: 20px;
  2476. right: 50px;
  2477. }
  2478. .error-type {
  2479. margin-right: 5px;
  2480. }
  2481. .error-type:hover {
  2482. cursor: pointer;
  2483. }
  2484. .box-card {
  2485. margin-top: 40px
  2486. }
  2487. .time {
  2488. font-size: 13px;
  2489. color: #999;
  2490. float: right;
  2491. margin-top: 5px;
  2492. }
  2493. .bottom {
  2494. margin-top: 13px;
  2495. line-height: 12px;
  2496. }
  2497. .button {
  2498. float: left;
  2499. }
  2500. .image {
  2501. width: 100%;
  2502. padding: 0%;
  2503. display: block;
  2504. }
  2505. .control {
  2506. z-index: 999;
  2507. position: relative;
  2508. top: 10px;
  2509. }
  2510. .checked {
  2511. margin-left: 10px;
  2512. font-size: 12px;
  2513. color: green;
  2514. }
  2515. .qr-code-div{
  2516. border-radius:10px;
  2517. background-color: RGB(245,245,245);
  2518. width: 200px;
  2519. height: 200px;
  2520. position:absolute;
  2521. top:-10;
  2522. left:0;
  2523. display: flex;
  2524. justify-content: center;
  2525. align-items: center;
  2526. }
  2527. .qr-code{
  2528. width: 190px;
  2529. height: 190px;
  2530. z-index: 999;
  2531. }
  2532. .qr-code-div:hover {
  2533. cursor: pointer;
  2534. // background-color:RGB(220,220,220);
  2535. width: 205px;
  2536. height: 205px;
  2537. }
  2538. </style>