applyLxWork.vue 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359
  1. <template>
  2. <!-- 发起付款申请 -->
  3. <el-dialog
  4. :close-on-click-modal="false"
  5. :close-on-press-escape="false"
  6. append-to-body
  7. :title="dialogTitle"
  8. :visible.sync="dialogLxVisible"
  9. top="50px"
  10. width="75%"
  11. :before-close="beforeClose"
  12. >
  13. <div class="tabsdom">
  14. <el-tabs v-model="activeName" @tab-click="handleClick">
  15. <el-tab-pane label="立项申请" name="first">
  16. <el-card shadow="always" style="padding: 15px 5px 5px 15px">
  17. <el-form
  18. ref="elformData"
  19. :model="formData"
  20. :rules="rules"
  21. class="payform"
  22. label-width="200px"
  23. size="medium"
  24. >
  25. <h3 style="margin-top: 0"><span style="color: red">*</span> 基本信息</h3>
  26. <el-card style="padding:0px 20px;margin-bottom: 25px">
  27. <el-row>
  28. <el-col :span="12">
  29. <el-form-item label="关联项目" prop="proId">
  30. <el-select v-model="formData.proId" filterable placeholder="关联项目名称" @change="proChange">
  31. <el-option
  32. v-for="item in ProjectData"
  33. :key="item.value"
  34. :label="item.label"
  35. :value="item.value"
  36. >
  37. <span style="float: left">{{ item.label }}</span>
  38. <span style="float: right; color: #8492a6; font-size: 13px">{{
  39. item.custname
  40. }}</span>
  41. </el-option>
  42. </el-select>
  43. </el-form-item>
  44. </el-col>
  45. <el-col :span="12">
  46. <el-form-item label="项目类型">
  47. <div style="line-height: 40px;height: 40px">{{ formData.protype }}</div>
  48. </el-form-item>
  49. </el-col>
  50. <el-col :span="12">
  51. <el-form-item label="储备项目状态">
  52. <div style="line-height: 40px;height: 40px">{{ formData.signStatus }}</div>
  53. </el-form-item>
  54. </el-col>
  55. <el-col :span="12">
  56. <el-form-item label="预计销售金额(元)">
  57. <div style="line-height: 40px;height: 40px">{{ formData.presales ? formData.presales + '(元)' : '' }}</div>
  58. </el-form-item>
  59. </el-col>
  60. </el-row>
  61. </el-card>
  62. <h3 style="margin-top: 0"><span style="color: red">*</span> 立项内容</h3>
  63. <el-card style="padding:0px 20px;margin-bottom: 25px">
  64. <el-row :gutter="15">
  65. <el-col :span="24">
  66. <el-form-item label="*项目概述" label-width="160px">
  67. <el-input type="textarea" v-model="formData.approval.proOverview" :rows="3"/>
  68. </el-form-item>
  69. </el-col>
  70. <el-col :span="12">
  71. <el-form-item label="*是否实现盈利" label-width="160px">
  72. <el-select v-model="formData.approval.isProfit" filterable clearable placeholder="是否实现盈利" >
  73. <el-option v-for="item in billTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
  74. </el-select>
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="12">
  78. <el-form-item label="*税率" label-width="160px">
  79. <el-input v-model="formData.approval.rate" />
  80. </el-form-item>
  81. </el-col>
  82. <el-col :span="24">
  83. <el-form-item label="*项目实施计划" label-width="160px">
  84. <el-input v-model="formData.approval.implementationContent" type="textarea" :raws="2"/>
  85. </el-form-item>
  86. </el-col>
  87. <el-col :span="24">
  88. <el-form-item label="*项目工作实施方案" label-width="160px" prop="proId">
  89. <el-upload
  90. class="upload-demo"
  91. :action="$constant.BASE_URI + '/FileController/upload'"
  92. :http-request="upload"
  93. :before-remove="beforeRemove"
  94. :file-list="fileUrlList"
  95. >
  96. <el-button v-if="!isView" size="small" type="primary">点击上传</el-button>
  97. <div v-if="!isView" slot="tip" class="el-upload__tip">请上传50MB以内的文件</div>
  98. <div slot="file" slot-scope="{file}">
  99. <a :href="file.url">{{ file.name }}</a>
  100. <span class="el-upload-list__item-actions">
  101. <i v-if="!isView" class="el-icon-delete" @click="handlePictureRemove(file,fileUrlList)" />
  102. </span>
  103. </div>
  104. </el-upload>
  105. </el-form-item>
  106. </el-col>
  107. <el-col :span="24">
  108. <el-form-item label="*调研报告" label-width="160px" prop="proId">
  109. <el-upload
  110. class="upload-demo"
  111. :action="$constant.BASE_URI + '/FileController/upload'"
  112. :http-request="upload2"
  113. :before-remove="beforeRemove"
  114. :file-list="fileUrlList2"
  115. >
  116. <el-button v-if="!isView" size="small" type="primary">点击上传</el-button>
  117. <div v-if="!isView" slot="tip" class="el-upload__tip">请上传50MB以内的文件</div>
  118. <div slot="file" slot-scope="{file}">
  119. <a :href="file.url">{{ file.name }}</a>
  120. <span class="el-upload-list__item-actions">
  121. <i v-if="!isView" class="el-icon-delete" @click="handlePictureRemove(file,fileUrlList2)" />
  122. </span>
  123. </div>
  124. </el-upload>
  125. </el-form-item>
  126. </el-col>
  127. <el-col :span="24">
  128. <el-form-item label="其他附件" label-width="160px" prop="proId">
  129. <el-upload
  130. class="upload-demo"
  131. :action="$constant.BASE_URI + '/FileController/upload'"
  132. :http-request="upload3"
  133. :before-remove="beforeRemove"
  134. :file-list="fileUrlList3"
  135. >
  136. <el-button v-if="!isView" size="small" type="primary">点击上传</el-button>
  137. <div v-if="!isView" slot="tip" class="el-upload__tip">请上传50MB以内的文件</div>
  138. <div slot="file" slot-scope="{file}">
  139. <a :href="file.url">{{ file.name }}</a>
  140. <span class="el-upload-list__item-actions">
  141. <i v-if="!isView" class="el-icon-delete" @click="handlePictureRemove(file,fileUrlList3)" />
  142. </span>
  143. </div>
  144. </el-upload>
  145. </el-form-item>
  146. </el-col>
  147. <el-col :span="24">
  148. <span class="card_title">*回款计划</span>
  149. <el-card shadow="always">
  150. <el-row>
  151. <el-col :span="24">
  152. <el-table
  153. v-loading="planLoading"
  154. :data="SalsReturnPlanData"
  155. stripe
  156. row-class-name="g_table_row"
  157. >
  158. <el-table-column type="index" width="60" />
  159. <el-table-column label="应收日期" prop="ardateStr" />
  160. <el-table-column label="提醒日期" prop="noticedateStr" />
  161. <el-table-column label="应收金额(元)" prop="aramountStr" header-align="center" align="center" />
  162. <el-table-column label="已收金额(元)" prop="rcamountStr" header-align="center" align="center" />
  163. <el-table-column label="收款名称" prop="arname" header-align="center" align="center" />
  164. <el-table-column label="收款状态" prop="statusStr" header-align="center" align="center" />
  165. <el-table-column align="right" width="160">
  166. <template slot="header">
  167. <el-button
  168. size="mini"
  169. class="ch-button-warning"
  170. @click="addPlan(ctrId)"
  171. >添加回款计划</el-button>
  172. </template>
  173. <template scope="scope">
  174. <el-button
  175. size="mini"
  176. type="danger"
  177. @click="deletePlan(scope.row.index) "
  178. >删除</el-button>
  179. </template>
  180. </el-table-column>
  181. </el-table>
  182. </el-col>
  183. </el-row>
  184. </el-card>
  185. </el-col>
  186. </el-row>
  187. </el-card>
  188. <h3 style="margin-top: 0"><span style="color: red">*</span> 预算信息</h3>
  189. <el-card style="padding:0px 20px;margin-bottom: 25px">
  190. <el-row :gutter="15">
  191. <el-col :span="24">
  192. <bug-get ref="bids" :key="keys" :pro-id="formData.proId" :is-audit="isView?'true':''" @handleInfo="handleChange" />
  193. </el-col>
  194. </el-row>
  195. </el-card>
  196. <h3 style="margin-top: 0">
  197. 申请内容
  198. </h3>
  199. <el-card style="padding:0px 20px;margin-bottom: 25px">
  200. <el-row :gutter="15">
  201. <el-col :span="24">
  202. <el-form-item label="申请理由" label-width="160px" prop="reason">
  203. <el-input
  204. v-model="formData.reason"
  205. :style="{width: '100%'}"
  206. clearable
  207. placeholder="请输入申请理由"
  208. />
  209. </el-form-item>
  210. </el-col>
  211. <el-col :span="24">
  212. <el-form-item label="备注说明" label-width="160px" prop="comment">
  213. <el-input
  214. v-model="formData.comment"
  215. :style="{width: '100%'}"
  216. clearable
  217. />
  218. </el-form-item>
  219. </el-col>
  220. </el-row>
  221. </el-card>
  222. </el-form>
  223. </el-card>
  224. </el-tab-pane>
  225. <el-tab-pane label="流程图 " name="second">
  226. <div style="width: 100%">
  227. <el-row>
  228. <el-col :span="24">
  229. <div class="node_info">
  230. <div>节点说明:</div>
  231. <div class="dis_flex" v-for="item in nodeColor">
  232. <div class="node_class" :style="{backgroundColor: item.nodeback}"></div>
  233. {{ item.name }}
  234. </div>
  235. </div>
  236. <div id="containerPay" style="width: 100%" v-show="true"></div>
  237. </el-col>
  238. </el-row>
  239. </div>
  240. </el-tab-pane>
  241. </el-tabs>
  242. </div>
  243. <div slot="footer">
  244. <el-button @click="setVisible(false,'')">取 消</el-button>
  245. <el-button :loading="buttonLoading" type="primary" @click="confirmSubmit()">确 定</el-button>
  246. </div>
  247. <el-dialog :title="dialogPlanTitle" :visible.sync="dialogPlanVisible" width="70%" top="50px" :close-on-click-modal="false" :close-on-press-escape="false" append-to-body @open="dlgPlanCRUDOpen">
  248. <el-form ref="planForm" :model="planForm" style="width: 100%;padding: 5px" :rules="planRules">
  249. <el-row>
  250. <el-col style="padding-bottom: 10px">
  251. <span class="card_title">基本信息</span>
  252. <el-card shadow="always" style="padding: 15px 5px 5px 15px">
  253. <el-row>
  254. <el-col :span="24">
  255. <el-row>
  256. <el-col :span="3" class="col-txt"><span>应收日期</span></el-col>
  257. <el-col :span="8" class="col-input">
  258. <el-form-item prop="ardate">
  259. <el-date-picker
  260. v-model="planForm.ardate"
  261. style="width: 100%"
  262. type="date"
  263. placeholder="应收日期"
  264. @change="arDateChange"
  265. />
  266. </el-form-item>
  267. </el-col>
  268. <el-col :span="4" class="col-txt"><span>提醒日期</span></el-col>
  269. <el-col :span="8" class="col-input">
  270. <el-form-item prop="noticedate">
  271. <el-date-picker
  272. v-model="planForm.noticedate"
  273. style="width: 100%"
  274. type="date"
  275. placeholder="提醒日期"
  276. />
  277. </el-form-item>
  278. </el-col>
  279. </el-row>
  280. <el-row>
  281. <el-col :span="3" class="col-txt"><span>应收金额</span></el-col>
  282. <el-col :span="8" class="col-input">
  283. <el-form-item prop="aramount">
  284. <el-input v-model="planForm.aramount" placeholder="0" type="number">
  285. <template slot="prepend">¥</template>
  286. </el-input>
  287. </el-form-item>
  288. </el-col>
  289. <el-col :span="4" class="col-txt"><span>收款名称</span></el-col>
  290. <el-col :span="8" class="col-input">
  291. <el-form-item prop="arname">
  292. <el-input v-model="planForm.arname" />
  293. </el-form-item>
  294. </el-col>
  295. </el-row>
  296. </el-col>
  297. </el-row>
  298. </el-card>
  299. </el-col>
  300. </el-row>
  301. <el-row>
  302. <el-col style="padding-bottom: 10px">
  303. <span class="card_title">其他信息</span>
  304. <el-card shadow="always" style="padding: 15px 5px 5px 15px">
  305. <el-row>
  306. <el-col :span="3" class="col-txt"><span>更新日期</span></el-col>
  307. <el-col :span="8" class="col-input">
  308. <el-form-item>
  309. <el-input v-model="planForm.updatedatStr" disabled />
  310. </el-form-item>
  311. </el-col>
  312. <el-col :span="3" class="col-txt"><span>更新人</span></el-col>
  313. <el-col :span="9" class="col-input">
  314. <el-form-item>
  315. <el-input v-model="planForm.updatedname" disabled />
  316. </el-form-item>
  317. </el-col>
  318. </el-row>
  319. </el-card>
  320. </el-col>
  321. </el-row>
  322. </el-form>
  323. <div slot="footer">
  324. <el-button @click="dialogPlanVisible = false">取 消</el-button>
  325. <el-button v-preventReClick type="primary" @click.native="confirmPlanSubmit()">确 定</el-button>
  326. </div>
  327. </el-dialog>
  328. </el-dialog>
  329. </template>
  330. <script>
  331. import { upload } from '@/static/utils/channel'
  332. import Base from '@/views/base/base'
  333. import BaseData from '@/views/base/baseData'
  334. import UserSelect from '@/views/components/UserSelect'
  335. import * as echarts from 'echarts'
  336. import Constant from '@/static/utils/constant'
  337. import BugGet from '@/views/workflow/components/myProcess/applyBudgetingApprove.vue'
  338. const lineStyle = {
  339. color: '#00116a',
  340. width: 2
  341. }
  342. const redLinestyle = {
  343. color: 'red',
  344. width: 2
  345. }
  346. const intiData = {}
  347. export default {
  348. name: 'ApplyPay',
  349. components: {
  350. UserSelect,
  351. BugGet
  352. },
  353. mixins: [Base, BaseData],
  354. data() {
  355. return {
  356. ProjectData: [],
  357. SalsReturnPlanData:[],
  358. ysInfo:true,
  359. formData: this.initForm(),
  360. dc_sign_status: Constant.dc_sign_status_2,
  361. hasRecord: false,
  362. planLoading: false,
  363. keys: 0,
  364. ctrId:'',
  365. fileUrlList:[],
  366. fileUrlList2:[],
  367. fileUrlList3:[],
  368. planForm: {
  369. id: '',
  370. planno: '',
  371. ctrid: '',
  372. ardate: '',
  373. aramount: '',
  374. arname: '',
  375. noticedate: '',
  376. updatedby: '',
  377. updatedname: '',
  378. updatedatStr: ''
  379. },
  380. planRules:{},
  381. isAdd:false,
  382. isView: false,
  383. dialogPlanVisible:false,
  384. dialogPlanTitle:'新增计划',
  385. hasNewTemplate:false,
  386. referenceId: '',
  387. fileError: false,
  388. bizByList: [],
  389. selectList: [],
  390. detailsForm: {},
  391. buttonLoading: false,
  392. // 查询的时候用的字典========================================
  393. dc_key: ['PAY_TYPE', 'BUDGET_CB', 'RECEIPT_TYPE'],
  394. fileDataIdsAction: 'https://jsonplaceholder.typicode.com/posts/',
  395. billTypeOptions: [
  396. { 'label': '是', 'value': '是' },
  397. { 'label': '否', 'value': '否'}
  398. ],
  399. nodeColor: [
  400. { name: '审核通过', nodeback: '#2A3980' },
  401. { name: '未经过', nodeback: '#999999' },
  402. { name: '退回', nodeback: '#E04242' },
  403. { name: '审核中', nodeback: '#E08E42' },
  404. { name: '撤回', nodeback: '#4294E0' }
  405. ],
  406. onlineForm: {},
  407. dialogTitle: '立项申请',
  408. dialogLxVisible: false,
  409. form: {},
  410. activeName: 'first',
  411. OutOrderList: [],
  412. rules: {
  413. fileDataIds: [{ required: false, message: '请上传发票文件', trigger: 'change' }],
  414. totalPayMoney: [{ required: true, message: '请输入订单累计已支付金额', trigger: 'change' }],
  415. payName: [{ required: true, message: '请输入付款名称', trigger: 'change' }],
  416. payMoney: [{ required: true, message: '请输入付款金额', trigger: 'change' }],
  417. reason: [{ required: true, trigger: 'blur', message: '请输入申请原因' }]
  418. // costsType: [{required: true, message: '请选择', trigger: 'change'}],
  419. }
  420. }
  421. },
  422. mounted() {
  423. this.initProType()
  424. this.generateDcMap()
  425. this.initDict(this.dc_key).then((res) => {
  426. this.initPro()
  427. })
  428. // /webServer/BugLibraryController/listBizUserAll
  429. },
  430. methods: {
  431. generateDcMap: function() {
  432. this.dc_map['dc_sign_status'] = this.$common.transDcMap(Constant.dc_sign_status_2)
  433. },
  434. upload(param){
  435. this.uploadRp(param,'fileUrlList')
  436. },
  437. upload2(param){
  438. this.uploadRp(param,'fileUrlList2')
  439. },
  440. upload3(param){
  441. this.uploadRp(param,'fileUrlList3')
  442. },
  443. uploadRp: function(param,fileName) {
  444. const _this = this
  445. _this.fileError = true
  446. upload(param, true).then((res) => {
  447. if (res.key === 200) {
  448. if('fileUrlList'===fileName){
  449. _this.fileUrlList.push(res)
  450. }else if('fileUrlList2'===fileName){
  451. _this.fileUrlList2.push(res)
  452. }else if('fileUrlList3'===fileName){
  453. _this.fileUrlList3.push(res)
  454. }
  455. this.$message.info('文件上传成功')
  456. } else {
  457. this.$message.error('文件上传失败')
  458. }
  459. _this.fileError = false
  460. })
  461. },
  462. initForm(){
  463. return{
  464. id:'',
  465. proId:'',
  466. ctrId:'',
  467. approvalId:'',
  468. workReceivableId:'',
  469. reason:'',
  470. comment:'',
  471. status:'',
  472. approvalForm:'',
  473. approval:{},
  474. workReceivableForm:''
  475. }
  476. },
  477. ctrMainByProId(proId){
  478. const _this = this
  479. this.ctrMainRequest('getByProId',{proId:proId}).then(res=>{
  480. if(res.data){
  481. _this.ctrId = res.data.id
  482. _this.getPlanData(res.data.id)
  483. }
  484. })
  485. },
  486. getPlanData: function(ctrId) {
  487. const _this = this
  488. this.SalsReturnPlanData = []
  489. if (ctrId) {
  490. this.planLoading = true
  491. const postData = this.$qs.stringify({
  492. ctrid: ctrId,
  493. pageNum: this.currentPage,
  494. pageSize: this.pageSize
  495. })
  496. console.log(postData)
  497. this.$axios({
  498. headers: {
  499. 'MVVM-Key': String(new Date().getTime()),
  500. 'xx': 'anything'
  501. },
  502. method: 'post',
  503. url: _this.$constant.BASE_URI + '/AccountReceivableController/list',
  504. data: postData
  505. }).then((res) => {
  506. console.log('sales return plan list', res)
  507. _this.$common.checkLoginStatus(res.data.statusCode)
  508. if (res.data.rows) {
  509. res.data.rows.forEach(function(item) {
  510. const json = {
  511. planstatus: item.planstatus,
  512. arname: item.arname,
  513. // aramountStr: '¥' + _this.$common.formatMoney(item.aramount),
  514. // rcamountStr: '¥' + _this.$common.formatMoney(item.receiveamount),
  515. ardateStr: _this.$common.transDate(item.ardate),
  516. noticedateStr: _this.$common.transDate(item.noticedate),
  517. id: item.id
  518. }
  519. const ra = _this.$common.formatMoney(item.receiveamount)
  520. json.rcamountStr = ra ? '¥' + ra : ''
  521. item.ysAmount = parseInt(item.aramount || 0)
  522. const sr = _this.$common.formatMoney(item.ysAmount)
  523. json.ysAmountStr = sr ? '¥' + sr : ''
  524. item.aramount = parseInt(item.aramount || 0) + parseInt(item.adjustamount || 0)
  525. const r = _this.$common.formatMoney(item.aramount)
  526. json.aramountStr = r ? '¥' + r : ''
  527. json.statusStr = '未收款'
  528. if (item.planstatus === '1') {
  529. json.statusStr = '收款中'
  530. } else if (item.planstatus === '2') {
  531. json.statusStr = '收款完成'
  532. }
  533. _this.SalsReturnPlanData.push(json)
  534. })
  535. }
  536. _this.planLoading = false
  537. }).catch((err, x) => {
  538. console.log('sales return plan list error', err, x)
  539. })
  540. }
  541. },
  542. arDateChange: function(val) {
  543. // console.log('contract date change:' + val)
  544. if (!val) return
  545. const time = new Date(val)
  546. time.setTime(time.getTime() - 3600 * 1000 * 24 * 15)
  547. this.planForm.noticedate = time
  548. },
  549. confirmPlanSubmit: function() {
  550. const _this = this
  551. this.$refs.planForm.validate(valid => {
  552. if (valid) {
  553. var acting = this.$notify({
  554. title: '正在上传信息,喝杯咖啡等等',
  555. type: 'warning'
  556. })
  557. const postData = {
  558. id: this.planForm.id,
  559. ctrid: this.ctrId,
  560. ardate: this.$common.transDate(this.planForm.ardate, Constant.DATE_PATTERN.DATE_TIME_h),
  561. aramount: this.planForm.aramount,
  562. arname: this.planForm.arname,
  563. noticedate: this.$common.transDate(this.planForm.noticedate, Constant.DATE_PATTERN.DATE_TIME_h),
  564. updatedby: this.planForm.updatedby,
  565. updatedat: this.$common.transDate(new Date(), Constant.DATE_PATTERN.DATE_TIME_h)
  566. }
  567. postData.ardateStr= postData.ardate.split(' ')[0]
  568. postData.noticedateStr= postData.noticedate.split(' ')[0]
  569. const r = _this.$common.formatMoney(postData.aramount)
  570. postData.aramountStr = r ? '¥' + r : ''
  571. postData.planno = this.planForm.planno
  572. postData.planstatus = '0'
  573. postData.groupId = this.$common.currUser() ? this.$common.currUser().groupId : ''
  574. postData.statusStr = '未收款'
  575. _this.SalsReturnPlanData.push(postData)
  576. _this.dialogPlanVisible = false
  577. _this.$notify({
  578. title: '添加成功',
  579. type: 'info'
  580. })
  581. } else {
  582. console.log('error submit!!')
  583. return false
  584. }
  585. })
  586. },
  587. /* 删除*/
  588. deletePlan: function(pId,index) {
  589. this.SalsReturnPlanData.splice(index,1)
  590. },
  591. /* 新增*/
  592. addPlan: function(ctrId) {
  593. debugger
  594. this.planForm = {
  595. id: '',
  596. planno: 'PLN-' + new Date().Format('yyyyMMddhhmm'),
  597. ctrid: ctrId,
  598. ardate: '',
  599. aramount: '',
  600. arname: '',
  601. noticedate: '',
  602. updatedby: '',
  603. updatedname: '',
  604. updatedatStr: ''
  605. }
  606. const currUser = this.$common.currUser()
  607. if (currUser) {
  608. this.planForm.updatedatStr = this.$common.transDate(new Date().getTime())
  609. this.planForm.updatedname = currUser.truename
  610. this.planForm.updatedby = currUser.id
  611. }
  612. this.isAdd = true
  613. this.dialogPlanVisible = true
  614. this.dialogPlanTitle = '新增计划'
  615. },
  616. initPro(){
  617. const _this = this
  618. this.proMainRequest('listAllByUserRole',{ signstatus: '2,3,6',realValidStatus:'0,3' }).then(res=>{
  619. if(res.data){
  620. res.data.forEach(function(item) {
  621. const json = {
  622. label: item.proname,
  623. value: item.id,
  624. protype: item.protype,
  625. prostatus: item.prostatus,
  626. signstatus: item.signstatus,
  627. realValidStatus: item.realValidStatus,
  628. custname: item.custname,
  629. closingItemStatus: item.closingItemStatus,
  630. createdAt: item.createdat,
  631. validstatus: item.validstatus,
  632. managedby: item.managedby,
  633. presales: item.presales
  634. }
  635. _this.ProjectData.push(json)
  636. _this.ProjectMap[json.value] = json
  637. })
  638. }
  639. })
  640. },
  641. getBudgetData() {
  642. const _this = this
  643. this.budGetingRequest('checkRecordApproval', { proId:this.formData.proId }).then(res => {
  644. if (res.data.hasRecord) {
  645. _this.hasRecord = true
  646. if (res.data.templateId) {
  647. const postData = {
  648. proId: _this.formData.proId,
  649. templateId: res.data.templateId
  650. }
  651. _this.budGetingRequest('checkNewTemplate', postData).then(res => {
  652. _this.hasNewTemplate = !res.data;
  653. _this.keys++
  654. _this.$nextTick(() => {
  655. this.$refs.bids.initData(_this.hasNewTemplate)
  656. })
  657. })
  658. }else {
  659. _this.keys++
  660. _this.$nextTick(() => {
  661. this.$refs.bids.initData(_this.hasNewTemplate)
  662. })
  663. }
  664. }else{
  665. _this.keys++
  666. _this.$nextTick(() => {
  667. this.$refs.bids.initData(_this.hasNewTemplate)
  668. })
  669. }
  670. })
  671. },
  672. handleChange(val){
  673. this.ysInfo = val
  674. },
  675. initLxWork(proId,status){
  676. this.formData.proId = proId
  677. this.proChange()
  678. this.setVisible(status)
  679. },
  680. proChange(){
  681. const _this = this
  682. _this.ProjectData.forEach(item=>{
  683. if(item.value===_this.formData.proId){
  684. _this.formData.protype = _this.ProTypeMap[item.protype]
  685. _this.formData.signStatus = _this.dc_map.dc_sign_status[item.signstatus]
  686. _this.formData.presales = item.presales
  687. _this.formData.proName = item.label
  688. }
  689. })
  690. _this.getBudgetData()
  691. _this.ctrMainByProId(_this.formData.proId)
  692. },
  693. beforeClose() {
  694. // this.formData = {
  695. // fileUrlList: []
  696. // }
  697. this.dialogLxVisible = false
  698. },
  699. handleClick(tab, event) {
  700. if (this.activeName == 'second') this.createNodeCanvas()
  701. },
  702. createNodeCanvas() {
  703. this.$nextTick(() => {
  704. let chartDom = document.getElementById('containerPay')
  705. var myCharts = echarts.init(chartDom)
  706. let charts = {
  707. nodes: [ // 节点
  708. {
  709. name: '申请人发起',
  710. value: [45, 100],
  711. symbol: 'image://' + require('../asste/huifangkuai.png'),
  712. symbolSize: [110, 60]
  713. },
  714. {
  715. name: '直接上级审核',
  716. value: [125, 100],
  717. symbol: 'image://' + require('../asste/huifangkuai.png'),
  718. symbolSize: [110, 60]
  719. },
  720. {
  721. name: '部门负责人审核',
  722. value: [205, 100],
  723. symbol: 'image://' + require('../asste/huifangkuai.png'),
  724. symbolSize: [110, 60]
  725. },
  726. {
  727. name: '综管采购负责人',
  728. value: [285, 100],
  729. symbol: 'image://' + require('../asste/huifangkuai.png'),
  730. symbolSize: [110, 60]
  731. },
  732. {
  733. name: '分管领导审核',
  734. value: [365, 100],
  735. symbol: 'image://' + require('../asste/huifangkuai.png'),
  736. symbolSize: [110, 60]
  737. },
  738. {
  739. name: '上级分管领导\n审核',
  740. value: [445, 100],
  741. symbol: 'image://' + require('../asste/huifangkuai.png'),
  742. symbolSize: [110, 60]
  743. },
  744. {
  745. name: '财务负责人',
  746. value: [525, 100],
  747. symbol: 'image://' + require('../asste/huifangkuai.png'),
  748. symbolSize: [110, 60]
  749. },
  750. {
  751. name: '总经理(董事长)\n审核',
  752. value: [605, 100],
  753. symbol: 'image://' + require('../asste/huifangkuai.png'),
  754. symbolSize: [110, 60]
  755. },
  756. {
  757. name: '结束',
  758. value: [685, 100],
  759. symbol: 'image://' + require('../asste/huifangkuai.png'),
  760. symbolSize: [110, 60]
  761. },
  762. {
  763. label: {
  764. show: true,
  765. color: 'red', // 节点文字颜色
  766. backgroundColor: '#f5f5f5'
  767. },
  768. itemStyle: {
  769. color: '#f5f5f5'
  770. },
  771. name: ' 退回发起人 ',
  772. value: [450, 500],
  773. symbolSize: [70, 20]
  774. },
  775. {
  776. label: {
  777. show: true,
  778. color: 'red', // 节点文字颜色
  779. backgroundColor: '#f5f5f5'
  780. },
  781. itemStyle: {
  782. color: '#f5f5f5'
  783. },
  784. name: '退回发起人 ',
  785. value: [400, 450],
  786. symbolSize: [70, 20]
  787. },
  788. {
  789. label: {
  790. show: true,
  791. color: 'red', // 节点文字颜色
  792. backgroundColor: '#f5f5f5'
  793. },
  794. itemStyle: {
  795. color: '#f5f5f5'
  796. },
  797. name: '退回发起人 ',
  798. value: [350, 400],
  799. symbolSize: [70, 20]
  800. },
  801. {
  802. label: {
  803. show: true,
  804. color: 'red', // 节点文字颜色
  805. backgroundColor: '#f5f5f5'
  806. },
  807. itemStyle: {
  808. color: '#f5f5f5'
  809. },
  810. name: ' 退回发起人 ',
  811. value: [300, 350],
  812. symbolSize: [20, 20]
  813. },
  814. {
  815. label: {
  816. show: true,
  817. color: 'red', // 节点文字颜色
  818. backgroundColor: '#f5f5f5'
  819. },
  820. itemStyle: {
  821. color: '#f5f5f5'
  822. },
  823. name: ' 退回发起人 ',
  824. value: [250, 300],
  825. symbolSize: [20, 20]
  826. },
  827. {
  828. label: {
  829. show: true,
  830. color: 'red', // 节点文字颜色
  831. backgroundColor: '#f5f5f5'
  832. },
  833. itemStyle: {
  834. color: '#f5f5f5'
  835. },
  836. name: ' 退回发起人 ',
  837. value: [250, 300],
  838. symbolSize: [20, 20]
  839. },
  840. {
  841. label: {
  842. show: true,
  843. color: 'red', // 节点文字颜色
  844. backgroundColor: '#f5f5f5'
  845. },
  846. itemStyle: {
  847. color: '#f5f5f5'
  848. },
  849. name: ' 退回发起人 ',
  850. value: [175, 250],
  851. symbolSize: [20, 20]
  852. },
  853. {
  854. label: {
  855. show: true,
  856. color: 'red', // 节点文字颜色
  857. backgroundColor: '#f5f5f5'
  858. },
  859. itemStyle: {
  860. color: '#f5f5f5'
  861. },
  862. name: ' 退回发起人 ',
  863. value: [100, 200],
  864. symbolSize: [20, 20]
  865. }
  866. ],
  867. linesData: [ // 连线
  868. {
  869. lineStyle: lineStyle,
  870. coords: [[45, 100], [100, 100]]
  871. },
  872. {
  873. lineStyle: lineStyle,
  874. coords: [[125, 100], [180, 100]]
  875. },
  876. {
  877. lineStyle: lineStyle,
  878. coords: [[205, 100], [260, 100]]
  879. },
  880. {
  881. lineStyle: lineStyle,
  882. coords: [[285, 100], [340, 100]]
  883. },
  884. {
  885. lineStyle: lineStyle,
  886. coords: [[365, 100], [420, 100]]
  887. },
  888. {
  889. lineStyle: lineStyle,
  890. coords: [[445, 100], [500, 100]]
  891. },
  892. {
  893. lineStyle: lineStyle,
  894. coords: [[525, 100], [580, 100]]
  895. },
  896. {
  897. lineStyle: lineStyle,
  898. coords: [[605, 100], [660, 100]]
  899. },
  900. {
  901. lineStyle: lineStyle,
  902. coords: [[610, 100], [610, 500]],
  903. symbol: 'none'
  904. },
  905. {
  906. lineStyle: lineStyle,
  907. coords: [[530, 100], [530, 450]],
  908. symbol: 'none'
  909. },
  910. {
  911. lineStyle: lineStyle,
  912. coords: [[450, 100], [450, 400]],
  913. symbol: 'none'
  914. },
  915. {
  916. lineStyle: lineStyle,
  917. coords: [[370, 100], [370, 350]],
  918. symbol: 'none'
  919. },
  920. {
  921. lineStyle: lineStyle,
  922. coords: [[290, 100], [290, 300]],
  923. symbol: 'none'
  924. },
  925. {
  926. lineStyle: lineStyle,
  927. coords: [[210, 100], [210, 250]],
  928. symbol: 'none'
  929. },
  930. {
  931. lineStyle: lineStyle,
  932. coords: [[130, 100], [130, 200]],
  933. symbol: 'none'
  934. },
  935. // {
  936. // lineStyle: lineStyle,
  937. // coords: [[50, 100], [50, 500]],
  938. // symbol: 'none'
  939. // },
  940. {
  941. lineStyle: lineStyle,
  942. coords: [[610, 500], [50, 500]],
  943. symbol: 'none'
  944. },
  945. {
  946. lineStyle: lineStyle,
  947. coords: [[530, 450], [50, 450]],
  948. symbol: 'none'
  949. },
  950. {
  951. lineStyle: lineStyle,
  952. coords: [[450, 400], [50, 400]],
  953. symbol: 'none'
  954. },
  955. {
  956. lineStyle: lineStyle,
  957. coords: [[370, 350], [50, 350]],
  958. symbol: 'none'
  959. },
  960. {
  961. lineStyle: lineStyle,
  962. coords: [[290, 300], [50, 300]],
  963. symbol: 'none'
  964. },
  965. {
  966. lineStyle: lineStyle,
  967. coords: [[210, 250], [50, 250]],
  968. symbol: 'none'
  969. },
  970. {
  971. lineStyle: lineStyle,
  972. coords: [[130, 200], [50, 200]],
  973. symbol: 'none'
  974. },
  975. {
  976. lineStyle: lineStyle,
  977. coords: [[50, 500], [50, 135]]
  978. },
  979. {
  980. lineStyle: lineStyle,
  981. coords: [[50, 450], [50, 135]]
  982. },
  983. {
  984. lineStyle: lineStyle,
  985. coords: [[50, 400], [50, 135]]
  986. },
  987. {
  988. lineStyle: lineStyle,
  989. coords: [[50, 350], [50, 135]]
  990. },
  991. {
  992. lineStyle: lineStyle,
  993. coords: [[50, 300], [50, 135]]
  994. },
  995. {
  996. lineStyle: lineStyle,
  997. coords: [[50, 250], [50, 135]]
  998. },
  999. {
  1000. lineStyle: lineStyle,
  1001. coords: [[50, 150], [50, 135]]
  1002. },
  1003. ]
  1004. }
  1005. let option = {
  1006. xAxis: {
  1007. min: 0,
  1008. max: 760,
  1009. padding: [0, 50, 0, 50],
  1010. show: false,
  1011. type: 'value'
  1012. },
  1013. yAxis: {
  1014. min: 0,
  1015. max: 650,
  1016. show: false,
  1017. type: 'value'
  1018. },
  1019. grid: {
  1020. left: 50,
  1021. right: 0,
  1022. bottom: 0,
  1023. top: 0
  1024. },
  1025. series: [
  1026. {
  1027. type: 'graph',
  1028. coordinateSystem: 'cartesian2d',
  1029. symbol: 'rect',
  1030. symbolSize: [80, 40],
  1031. itemStyle: {
  1032. color: 'rgb(225,7,7)'
  1033. },
  1034. symbolOffset: [10, 0],
  1035. // force: {
  1036. // edgeLength: 100,//连线的长度
  1037. // repulsion: 200 //子节点之间的间距
  1038. // },
  1039. label: {
  1040. show: true,
  1041. color: 'white' // 节点文字颜色
  1042. },
  1043. data: charts.nodes
  1044. },
  1045. {
  1046. type: 'lines',
  1047. polyline: false,
  1048. coordinateSystem: 'cartesian2d',
  1049. symbol: ['', 'arrow'],
  1050. symbolSize: 10,
  1051. data: charts.linesData
  1052. }
  1053. ]
  1054. }
  1055. myCharts.clear()
  1056. myCharts.setOption(option)
  1057. window.addEventListener('resize', () => {
  1058. myCharts.resize()
  1059. })
  1060. })
  1061. },
  1062. handlePictureRemove(file, fileUrlList) {
  1063. var index = fileUrlList.indexOf(file)
  1064. fileUrlList.splice(index, 1)
  1065. },
  1066. uploadFile: function(param) {
  1067. const _this = this
  1068. upload(param, true).then((res) => {
  1069. _this.formData.fileUrlList.push(res)
  1070. })
  1071. },
  1072. downloadFaPiao(url) {
  1073. window.open(url)
  1074. },
  1075. parentMethod(val) {
  1076. if (val.length > 0) {
  1077. this.formData.ccList = val.join(',')
  1078. }
  1079. },
  1080. async getBizeUserList() {
  1081. const { data } = await this.baseRequest1('BugLibraryController', 'listBizUserAll', {})
  1082. this.bizByList = data
  1083. },
  1084. async selectOutOrderDetails(e) {
  1085. const postData = { id: e }
  1086. const { data } = await this.baseRequest1('OutOrderMainController', 'getVoById', postData)
  1087. // ApplyPaymentController/getTotalMoneyByProId
  1088. let index = this.OutOrderList.findIndex((a) => a.id == e)
  1089. const res = await this.baseRequest1('ApplyPaymentController', 'getTotalMoneyByProId', { proId: this.OutOrderList[index].proId })
  1090. const res2 = await this.baseRequest1('ApplyPaymentController', 'getTotalPayMoneyByOrderNo', { orderNo: this.OutOrderList[index].orderNo })
  1091. let fileUrlList = this.formData.fileUrlList
  1092. this.formData = { ...data, fileUrlList: fileUrlList }
  1093. this.formData.projectName = data.proName
  1094. this.formData.customerName = data.custName
  1095. // this.formData.supplierName = data.bizName
  1096. this.formData.bizBy = data.bizBy
  1097. this.formData.dealAt = this.$common.transServDate(data.dealAt)
  1098. this.formData.outTimeline = this.$common.transServDate(data.outTimeline)
  1099. this.formData.orderNo = data.custName + '-' + data.orderNo
  1100. this.formData.orderId = e
  1101. this.formData.totalReturnMoney = res.data.data
  1102. this.formData.totalPayMoney = res2.data.data
  1103. // this.formData.fileUrlList = []
  1104. },
  1105. // /webServer/OutOrderMainController/list
  1106. async getOutOrderList() {
  1107. // 获取采购订单号下拉数据
  1108. const postData = {
  1109. pageNum: 1,
  1110. pageSize: 10000,
  1111. shouldAmount: 0
  1112. }
  1113. const { data } = await this.baseRequest1('OutOrderMainController', 'list', postData)
  1114. this.OutOrderList = data.rows
  1115. },
  1116. baseRequest1(prefix, opUrl, postData) {
  1117. return this.$channel.globleRequest(prefix, opUrl, postData, 'project task')
  1118. },
  1119. async confirmSubmit() {
  1120. if(!this.formData.proId){
  1121. this.$message.warning('请选择项目')
  1122. return
  1123. }
  1124. if(!this.formData.approval.proOverview){
  1125. this.$message.warning('请输入项目概述')
  1126. return
  1127. }
  1128. if(!this.formData.approval.isProfit){
  1129. this.$message.warning('请选择是否实现盈利')
  1130. return
  1131. }
  1132. if(!this.formData.approval.rate){
  1133. this.$message.warning('请输入税率')
  1134. return
  1135. }
  1136. if(!this.formData.approval.implementationContent){
  1137. this.$message.warning('请输入项目实施计划')
  1138. return
  1139. }
  1140. if(this.fileUrlList&&this.fileUrlList.length>0){
  1141. this.formData.approval.implementationProgramme=JSON.stringify(this.fileUrlList)
  1142. }else{
  1143. this.$message.warning('请上传实施方案')
  1144. return
  1145. }
  1146. if(this.fileUrlList2&&this.fileUrlList2.length>0){
  1147. this.formData.approval.researchReport=JSON.stringify(this.fileUrlList2)
  1148. }else{
  1149. this.$message.warning('请上传调研报告')
  1150. return
  1151. }
  1152. if(this.fileUrlList3&&this.fileUrlList3.length>0){
  1153. this.formData.approval.otherFile=JSON.stringify(this.fileUrlList3)
  1154. }
  1155. if(this.SalsReturnPlanData&&this.SalsReturnPlanData.length>0){
  1156. this.formData.workReceivableForm= JSON.stringify(this.SalsReturnPlanData)
  1157. }else{
  1158. this.$message.warning('请添加回款计划')
  1159. return
  1160. }
  1161. if(this.ysInfo){
  1162. this.$message.warning('请添加预算信息')
  1163. return
  1164. }
  1165. this.formData.ctrId = this.ctrId
  1166. this.formData.approval.status = '0'
  1167. this.formData.approval.proId = this.formData.proId
  1168. this.formData.approval.groupId = this.$common.currUser().groupId
  1169. this.formData.groupId = this.$common.currUser().groupId
  1170. this.formData.approvalForm = JSON.stringify(this.formData.approval)
  1171. // this.formData.approval ={}
  1172. this.$refs.elformData.validate(async(valid) => {
  1173. if (valid) {
  1174. this.$refs.bids.toSave('1')
  1175. let formData = { ...this.formData }
  1176. formData.approval={}
  1177. this.buttonLoading = true
  1178. const { data } = await this.baseRequest1(
  1179. 'ApplyLxWorkController',
  1180. 'addApplyLxWork',
  1181. { ...formData })
  1182. this.buttonLoading = false
  1183. if (data.code == 200) {
  1184. this.$message.success('流程已发起')
  1185. this.dialogLxVisible = false
  1186. this.formData= this.initForm()
  1187. this.fileUrlList = []
  1188. this.fileUrlList2 = []
  1189. this.fileUrlList3 = []
  1190. this.ctrId =''
  1191. this.SalsReturnPlanData = []
  1192. this.$emit('getData')
  1193. }
  1194. //
  1195. } else {
  1196. }
  1197. })
  1198. },
  1199. setVisible(status, data) {
  1200. this.dialogLxVisible = status
  1201. if (this.$refs.elformData) {
  1202. this.$refs.elformData.clearValidate()
  1203. }
  1204. },
  1205. budGetingRequest(opUrl, postData) {
  1206. return this.$channel.globleRequest('BudgetMakingController', opUrl, postData, 'project')
  1207. },
  1208. ctrMainRequest(opUrl, postData) {
  1209. return this.$channel.globleRequest('CtrMainController', opUrl, postData, 'project')
  1210. },
  1211. proMainRequest(opUrl, postData) {
  1212. return this.$channel.globleRequest('ProMainController', opUrl, postData, 'project')
  1213. }
  1214. }
  1215. }
  1216. </script>
  1217. <style lang="scss">
  1218. #containerPay {
  1219. width: 100%;
  1220. height: 600px;
  1221. background: #F5F5F5;
  1222. }
  1223. .mb25 {
  1224. margin-bottom: 25px;
  1225. }
  1226. .pdtopbottom16 {
  1227. padding: 0px 16px;
  1228. }
  1229. .pdtop16px {
  1230. padding-top: 16px;
  1231. }
  1232. .elformdom {
  1233. label {
  1234. text-align: right;
  1235. font-size: 16px;
  1236. font-family: 微软雅黑;
  1237. padding-right: 10px;
  1238. line-height: 40px;
  1239. word-break: keep-all;
  1240. white-space: nowrap;
  1241. -webkit-font-smoothing: antialiased;
  1242. color: #303133;
  1243. text-rendering: optimizeLegibility;
  1244. font-weight: 400;
  1245. }
  1246. .el-radio {
  1247. height: 15px;
  1248. margin-top: -19px;
  1249. }
  1250. }
  1251. .payform {
  1252. .el-form-item__label {
  1253. text-align: right;
  1254. font-size: 16px;
  1255. font-family: 微软雅黑;
  1256. padding-right: 10px;
  1257. line-height: 40px;
  1258. word-break: keep-all;
  1259. white-space: nowrap;
  1260. font-weight: 400;
  1261. }
  1262. }
  1263. .tabsdom {
  1264. .el-tabs__header {
  1265. text-align: center !important;
  1266. width: 139px !important;
  1267. text-align: center !important;
  1268. display: block !important;
  1269. margin: auto !important;
  1270. margin-bottom: 15px !important;
  1271. }
  1272. .el-tabs__nav-wrap::after {
  1273. display: none;
  1274. }
  1275. }
  1276. .cost_form {
  1277. .col-input {
  1278. font-weight: 400;
  1279. }
  1280. .el-form-item__label {
  1281. text-align: right;
  1282. font-size: 16px;
  1283. font-family: 微软雅黑;
  1284. padding-right: 10px;
  1285. line-height: 40px;
  1286. word-break: keep-all;
  1287. white-space: nowrap;
  1288. color: #606266;
  1289. text-rendering: optimizeLegibility;
  1290. font-weight: 400;
  1291. }
  1292. .el-form-item__label .moneydetails {
  1293. text-align: right;
  1294. font-size: 16px;
  1295. font-family: 微软雅黑;
  1296. padding-right: 10px;
  1297. line-height: 40px;
  1298. word-break: keep-all;
  1299. white-space: nowrap;
  1300. color: #606266;
  1301. text-rendering: optimizeLegibility;
  1302. font-weight: 400;
  1303. }
  1304. }
  1305. </style>