applyTurn.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797
  1. <script setup>
  2. import { computed, onMounted, ref, watch,nextTick } from 'vue'
  3. import { ElMessage,ElMessageBox } from 'element-plus'
  4. import { useRoute,useRouter } from 'vue-router'
  5. import { customInterence } from '@/api/api.js'
  6. import $ from 'jquery'
  7. import imgPreview from '@/components/imgPreview.vue'
  8. // import pdf from 'vue-pdf'
  9. import {CalculationDate} from '@/utils/CalculationDate'
  10. import raiPermissionbox from './components/raiPermissionbox.vue'
  11. const $route = useRoute();
  12. const $router = useRouter();
  13. const formRule = {
  14. amount:[
  15. { required: true, message: '合同金额不能为空', trigger: 'blur' },
  16. { type: 'number', message: '合同金额必须为数字'}
  17. ],
  18. payway:[
  19. { required: true, message: '付款方式不能为空', trigger: 'blur' },
  20. ],
  21. payfrom:[
  22. { required: true, message: '付款渠道不能为空', trigger: 'blur' },
  23. ],
  24. imglist:[
  25. { required: true, message: '合同附件不能为空', trigger: 'blur' },
  26. ]
  27. }
  28. const isXClassCustom = computed(() =>{
  29. return companyInfo.value.Status.includes('永续') || companyInfo.value.Status.includes('X类试用')
  30. })
  31. const isRoleType = computed(() => {
  32. return localStorage.getItem('RoleType') || ''
  33. })
  34. const companyInfo = ref(JSON.parse(sessionStorage.getItem('companyInfo')) || {})//客户基本信息
  35. const selectedQuarters = ref([])
  36. const hasNoChild = ref(false) // 医药、消费、科技、智造是否没有主客观
  37. const authList = ref([])
  38. const formData = ref({
  39. contract_type:'',
  40. term:'',
  41. amount:'',
  42. payway:'',
  43. payfrom:'',
  44. imglist:[],//合同列表图片
  45. setmeal:'',
  46. qyBigServeCheck:0,
  47. })
  48. /* 重新申请获取上次申请的合同信息并回显 */
  49. function getLastContract() {
  50. customInterence.reapplyDetail({
  51. CompanyApprovalId:parseInt(companyInfo.value.CompanyApprovalId)
  52. }).then(res => {
  53. if(res.Ret === 200) {
  54. /* 处理日期 */
  55. let date_arr = [];
  56. date_arr.push(res.Data.Item.StartDate);
  57. date_arr.push(res.Data.Item.EndDate);
  58. formData.value = {
  59. contract_type:res.Data.Item.ContractType,
  60. term:date_arr,
  61. amount:res.Data.Item.Money,
  62. payway:res.Data.Item.PayMethod,
  63. payfrom:res.Data.Item.PayChannel,
  64. imglist:res.Data.Item.ImgUrl.split('#'),//合同列表图片
  65. setmeal:res.Data.Item.PackageType,
  66. qyBigServeCheck:res.Data.Item.RaiPackageType
  67. }
  68. selectedQuarters.value = res.Data.Item.Quarter.split(',')
  69. let newArr = [];
  70. /* 处理权限列表 */
  71. if((companyInfo.value.CompanyType == '权益' || isRoleType.value== '权益') && !isXClassCustom.value ) {
  72. res.Data.Item.PermissionList[0].Items.map(item => {
  73. item.disabled=item.isIndeterminate=false
  74. if(item.ChartPermissionId==22 && (!item.Child)) hasNoChild.value=true
  75. })
  76. /* 处理数据把复选框 拆分成三个*/
  77. res.Data.Item.PermissionList.length&&res.Data.Item.PermissionList.forEach(item => {
  78. let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
  79. let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032,52,53,54,138,62].includes(key.ChartPermissionId))
  80. let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
  81. let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
  82. let obj = {
  83. ...item,
  84. Items:arr,
  85. ItemsPrivate,
  86. ItemsUp,
  87. ItemsBig
  88. }
  89. newArr.push(obj)
  90. })
  91. } else {
  92. res.Data.Item.PermissionList.forEach(item => {
  93. item.CheckList=item.CheckList||[]
  94. item.Items=item.Items||[]
  95. let obj = {
  96. checkAll:item.CheckList&&item.CheckList.length===item.Items.length?true:false,
  97. isIndeterminate:item.CheckList&&item.CheckList.length>0 && item.CheckList.length<item.Items.length,
  98. ...item,
  99. }
  100. newArr.push(obj)
  101. })
  102. }
  103. authList.value = newArr;
  104. formData.value.setmeal == '1' && setmealChange()
  105. }
  106. })
  107. }
  108. //套餐的选择
  109. function setmealChange(){
  110. if(formData.value.setmeal == '1'){
  111. authList.value.forEach(item => {
  112. if(item.ClassifyName != '市场策略') {
  113. item.Items.forEach(key => {
  114. item.CheckList.push(key.ChartPermissionId)
  115. key.Checked = true
  116. key.disabled = true
  117. })
  118. item.isIndeterminate = false
  119. item.checkAll = true
  120. item.disabled = true
  121. }
  122. })
  123. } else {
  124. authList.value.forEach(item => {
  125. if(item.Items.some(_e=>_e.IsPublic==1)){
  126. item.CheckList = []
  127. item.Items.forEach(_e=>{
  128. if(_e.IsPublic==1){
  129. item.CheckList.push(_e.ChartPermissionId)
  130. }
  131. _e.disabled=false
  132. })
  133. item.isIndeterminate = true
  134. }else {
  135. item.Items.forEach(key => {
  136. key.Checked = false
  137. key.disabled = false
  138. })
  139. item.CheckList = []
  140. item.isIndeterminate = false
  141. item.checkAll = false
  142. item.disabled = false
  143. }
  144. })
  145. ElMessage.warning('请勾选品种')
  146. }
  147. }
  148. /* 获取基本权限信息 */
  149. function getAuthBasic() {
  150. customInterence.authList({
  151. IsShowYanXuanKouDian:true,
  152. CompanyStatus:companyInfo.value.Status
  153. }).then(res => {
  154. let newArr = [];
  155. if(res.Ret === 200) {
  156. if((companyInfo.value.CompanyType == '权益' || isRoleType.value== '权益') && !isXClassCustom.value) {
  157. res.Data.List[0].Items.map(item => {
  158. item.disabled=item.isIndeterminate=false
  159. if(item.ChartPermissionId==22 && (!item.Child)) hasNoChild.value=true
  160. })
  161. /* 处理数据把复选框 拆分成三个*/
  162. res.Data.List.length&&res.Data.List.forEach(item => {
  163. let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
  164. let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032,52,53,54,138,62].includes(key.ChartPermissionId))
  165. let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
  166. let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
  167. let obj = {
  168. ...item,
  169. Items:arr,
  170. ItemsPrivate,
  171. ItemsUp,
  172. ItemsBig
  173. }
  174. newArr.push(obj)
  175. })
  176. }else {
  177. res.Data.List.length&&res.Data.List.forEach(item => {
  178. item.CheckList=item.CheckList||[]
  179. item.Items=item.Items||[]
  180. let obj = {
  181. checkAll:item.CheckList&&item.CheckList.length===item.Items.length?true:false,
  182. isIndeterminate:item.CheckList&&item.CheckList.length>0 && item.CheckList.length<item.Items.length,
  183. ...item,
  184. }
  185. newArr.push(obj)
  186. })
  187. }
  188. authList.value = newArr;
  189. }
  190. })
  191. }
  192. //获取客户申请转正的合同类型接口
  193. function getConstractType(){
  194. customInterence.applyTurnContractType({CompanyId:Number(companyInfo.value.CompanyId)}).then(res=>{
  195. if(res.Ret===200){
  196. formData.value.contract_type=res.Data.ContractType
  197. }
  198. })
  199. }
  200. onMounted(() => {
  201. if($route.query.isReapply) {
  202. getLastContract();
  203. }else {
  204. getAuthBasic();
  205. //修改为直接获取接口中数据
  206. getConstractType()
  207. }
  208. })
  209. const formDataRef = ref(null)
  210. const raiPermissionboxRef = ref(null)
  211. /* 提交 */
  212. function saveHandle() {
  213. formDataRef.value.validate((valid) => {
  214. if (valid) {
  215. /* 处理权限列表 */
  216. let checkArr = [];
  217. let checkArrName = [];
  218. let hasMinusSignVal = 0
  219. if((companyInfo.value.CompanyType==='权益' || isRoleType.value== '权益') && !isXClassCustom.value){
  220. hasMinusSignVal = raiPermissionboxRef.value[0].minus_sign_val;
  221. authList.value.forEach(item => {
  222. if(item.CheckList.length) {
  223. checkArr.push(item.CheckList)
  224. item.ItemsUp.forEach(key=>{
  225. if(item.CheckList.includes(key.ChartPermissionId)) {
  226. checkArrName.push(key.PermissionName)
  227. }
  228. })
  229. }
  230. })
  231. }else {
  232. authList.value.forEach(item => {
  233. if(item.CheckList.length) {
  234. checkArr.push(item.CheckList)
  235. }
  236. })
  237. }
  238. const hasFiftyTwo = checkArr.flat(2).includes(52);
  239. if(hasFiftyTwo && !hasMinusSignVal) return ElMessage.error('请输入研选扣点数')
  240. if(!checkArr.length && companyInfo.value.CompanyType === '权益') {
  241. ElMessage.warning('请选择权限!');
  242. return
  243. }else {
  244. let PermissionIds = [... new Set(checkArr.flat(2))].join(',');
  245. let params = {
  246. CompanyId:Number(companyInfo.value.CompanyId),
  247. CompanyApprovalId:companyInfo.value.CompanyApprovalId?parseInt(companyInfo.value.CompanyApprovalId):0,
  248. ContractType:formData.value.contract_type,
  249. StartDate:formData.value.term[0],
  250. EndDate:formData.value.term[1],
  251. ImgUrl:formData.value.imglist.join('#'),
  252. Money:Number(formData.value.amount),
  253. PayChannel:formData.value.payfrom,
  254. PayMethod:formData.value.payway,
  255. PermissionIds,
  256. PackageType:formData.value.setmeal ? formData.value.setmeal : 0,
  257. PermissionNames:checkArrName.length? checkArrName.join(','):'',
  258. RaiPackageType:formData.value.qyBigServeCheck||0,
  259. Points:hasMinusSignVal||0
  260. }
  261. customInterence.applyTurn(params).then(res => {
  262. if(res.Ret === 200) {
  263. ElMessage.success(res.Msg);
  264. $router.push({path:`/${$route.meta.pathFrom}`})
  265. }
  266. })
  267. }
  268. }
  269. })
  270. }
  271. /* 取消 */
  272. function cancelHandle() {
  273. $router.push({path:`/${$route.meta.pathFrom}`})
  274. }
  275. /* 选择全选或取消全选 */
  276. function handleCheckAll(item) {
  277. // 取到所有的子菜单id
  278. let ids = item.Items.map(item =>{
  279. return item.ChartPermissionId
  280. })
  281. item.CheckList = item.checkAll ? ids : [];
  282. item.isIndeterminate = false;
  283. }
  284. /* 复选框組选中时 */
  285. function handleChecked(item) {
  286. let len = item.CheckList.length;
  287. item.checkAll = len === item.Items.length;
  288. item.isIndeterminate = len > 0 && len < item.Items.length;
  289. }
  290. function dateChange(e){
  291. if(!formData.value) return
  292. if(parseInt((new Date() - new Date(formData.value.term[1]))/(1000*3600*24)) > 0) {
  293. ElMessage.error('结束日期不能小于今天!')
  294. formData.value.term = []
  295. return
  296. }
  297. if(e){
  298. ElMessageBox.alert(`你选择的合同期限是 ${CalculationDate(formData.value.term[0],formData.value.term[1])}`, '', {
  299. confirmButtonText: '确定'
  300. });
  301. }
  302. }
  303. function setSelectVarietyDisabled(item){
  304. return item.Items.some(_e=>_e.IsPublic==1)||item.disabled
  305. }
  306. const img_replace = ref('')//重新上传的img
  307. const isPreviewimg = ref(false)
  308. const preAct = ref(0)
  309. const isShowToggle = ref(false)//是否显示切换
  310. const uploadloading = ref(false)
  311. /* 预览 */
  312. function preview(id,index,img) {
  313. if(img.indexOf('.pdf') == -1) {
  314. preAct.value = index;
  315. /* 是否显示左右切换 */
  316. let bol = formData.value.imglist.some(item => {
  317. return item.indexOf('.pdf') != -1
  318. })
  319. // 有pdf或图片只有一张
  320. if(bol || formData.value.imglist.length<=1) {
  321. isShowToggle.value = false
  322. }else {
  323. isShowToggle.value = true
  324. }
  325. isPreviewimg.value = true;
  326. }else {
  327. window.open(img)
  328. }
  329. }
  330. function clickinput(index){ //上传模拟点击
  331. img_replace.value = '';
  332. if(index) {
  333. img_replace.value = index;
  334. }
  335. $("#file").click();
  336. }
  337. function fileSelected(){ //选择文件上传
  338. if( document.getElementById('file').files[0] ){
  339. let hostfile = document.getElementById('file').files[0];
  340. let size = Math.floor(hostfile.size / 1024 / 1024);
  341. if( size>200 ){
  342. ElMessage.error('上传文件大小不能大于200M!');
  343. hostfile = {};
  344. return false
  345. }
  346. if( hostfile.name.toLowerCase().includes('.png') || hostfile.name.toLowerCase().includes('.jpg') || hostfile.name.toLowerCase().includes('.jpeg') || hostfile.name.toLowerCase().includes('.pdf') ){
  347. let form = new FormData();
  348. form.append('file',hostfile); //hostfile.name
  349. uploadloading.value=true;
  350. customInterence.upload(form).then((res) => {
  351. if( res.Ret === 200 ){
  352. /* 是替换还是新增 */
  353. if(img_replace.value) {
  354. formData.value.imglist.splice(img_replace.value-1,1,res.Data.ResourceUrl)
  355. }else {
  356. if(formData.value.imglist.length >= 4) {
  357. ElMessage.warning('最多上传4张')
  358. }else {
  359. formData.value.imglist.push(res.Data.ResourceUrl)
  360. }
  361. }
  362. }
  363. uploadloading.value=false;
  364. $("#file").val('');
  365. hostfile = {};
  366. });
  367. }else{
  368. ElMessage.error('上传文件格式不正确!');
  369. }
  370. }
  371. }
  372. function closePreview() {
  373. isPreviewimg.value = false;
  374. }
  375. function togglePre(type) {
  376. if(type==1) {
  377. preAct.value--;
  378. if(preAct.value < 0) {
  379. preAct.value = formData.value.imglist.length-1;
  380. }
  381. }else {
  382. preAct.value++;
  383. if(preAct.value > formData.value.imglist.length-1) {
  384. preAct.value = 0;
  385. }
  386. }
  387. }
  388. const selectedDateRange = computed(()=> {
  389. if (selectedQuarters.value.length) {
  390. const sortedQuarters = [...selectedQuarters.value].sort();
  391. const startDate = quarterToDateRange(sortedQuarters[0]).split(" ~ ")[0];
  392. const endDate = quarterToDateRange(sortedQuarters[selectedQuarters.value.length - 1]).split(" ~ ")[1];
  393. return `${startDate} ~ ${endDate}`;
  394. }
  395. return "";
  396. })
  397. function quarterToDateRange(quarterLabel) {
  398. const [year, q] = quarterLabel.split("Q");
  399. switch (parseInt(q)) {
  400. case 1:
  401. return `${year}-01-01 ~ ${year}-03-31`;
  402. case 2:
  403. return `${year}-04-01 ~ ${year}-06-30`;
  404. case 3:
  405. return `${year}-07-01 ~ ${year}-09-30`;
  406. case 4:
  407. return `${year}-10-01 ~ ${year}-12-31`;
  408. }
  409. }
  410. const quarters = ref(generateQuarters())
  411. function generateQuarters() {
  412. const currentDate = new Date();
  413. const currentYear = currentDate.getFullYear();
  414. let currentQuarter = Math.floor(currentDate.getMonth() / 3) + 1;
  415. let quarters = [];
  416. for (let i = 3; i >= 0; i--) {
  417. // 包括当前季度和前三个季度
  418. let year = currentYear;
  419. let quarter = currentQuarter - i;
  420. while (quarter <= 0) {
  421. year--; // 上一年
  422. quarter += 4; // 季度数增加
  423. }
  424. quarters.push({
  425. label: `${year}Q${quarter}`,
  426. value: `${year}Q${quarter}`,
  427. });
  428. }
  429. return quarters;
  430. }
  431. function checkboxInputHandler(){
  432. formData.value.term = selectedQuarters.value ? [selectedDateRange.value.split(" ~ ")[0],selectedDateRange.value.split(" ~ ")[1]]:[]
  433. }
  434. function isDisabled(quarter) {
  435. if (selectedQuarters.value.length === 0) return false;
  436. const sortedSelected = [...selectedQuarters.value].sort();
  437. const firstIndex = quarters.value.findIndex((q) => q.value === sortedSelected[0]);
  438. const lastIndex = quarters.value.findIndex((q) => q.value === sortedSelected[sortedSelected.length - 1]);
  439. const currentIndex = quarters.value.findIndex((q) => q.value === quarter.value);
  440. return currentIndex < firstIndex - 1 || currentIndex > lastIndex + 1;
  441. }
  442. const showAlert = ref(true)
  443. watch(() => selectedQuarters.value,
  444. (newValue) => {
  445. if (!newValue.length) return;
  446. if (!isConsecutiveSelection() && showAlert.value && isXClassCustom.value) {
  447. showAlert.value = false;
  448. selectedQuarters.value.pop();
  449. ElMessage.error("只能选择相邻的季度");
  450. nextTick(() => {
  451. selectedQuarters.value.pop();
  452. showAlert.value = true;
  453. });
  454. }
  455. }
  456. )
  457. function isConsecutiveSelection() {
  458. const sortedSelectedIndexes = selectedQuarters.value.map((sq) => quarters.value.findIndex((aq) => aq.value === sq)).sort((a, b) => a - b);
  459. for (let i = 0; i < sortedSelectedIndexes.length - 1; i++) {
  460. if (sortedSelectedIndexes[i + 1] - sortedSelectedIndexes[i] !== 1) {
  461. return false;
  462. }
  463. }
  464. return true;
  465. }
  466. </script>
  467. <template>
  468. <div class="applyTurn_container">
  469. <div class="card_cont">
  470. <div class="info">
  471. <h3 class="tit">客户信息</h3>
  472. <ul class="info_list">
  473. <li>
  474. 客户名称:{{companyInfo.CompanyName}}
  475. </li>
  476. <li>
  477. 社会信用码:{{companyInfo.CreditCode}}
  478. </li>
  479. <li>
  480. 地址:{{companyInfo.Address}}
  481. </li>
  482. <li>
  483. 客户类型:{{companyInfo.CompanyType}}
  484. </li>
  485. <li>
  486. 客户状态:{{companyInfo.Status}}
  487. </li>
  488. <li>
  489. 客户来源:{{companyInfo.Source}}
  490. </li>
  491. <li>
  492. 行业:{{companyInfo.IndustryName}}
  493. </li>
  494. <li>
  495. 所属销售:{{companyInfo.SellerName}}
  496. </li>
  497. <li>
  498. 备注:{{companyInfo.Reasons}}
  499. </li>
  500. </ul>
  501. </div>
  502. </div>
  503. <!-- 合同列表 -->
  504. <div class="card_cont">
  505. <div class="apply_info">
  506. <h3 style="fontSize:16px;">申请信息</h3>
  507. <div class="info_cont">
  508. <span style="display:block;marginBottom:30px;color:#333;paddingLeft:10px;">申请内容:试用转正式</span>
  509. <el-form
  510. @submit.prevent
  511. inline
  512. :model="formData"
  513. :rules="formRule"
  514. hide-required-asterisk
  515. ref="formDatRef"
  516. label-width="100px"
  517. class="demo-ruleForm"
  518. >
  519. <el-form-item label="合同类型" prop="contract_type" style="width:100%" v-if="formData.contract_type">
  520. <el-radio style="margin-right:5px" v-model="formData.contract_type" :label="formData.contract_type"/>
  521. <el-tooltip
  522. style="cursor: pointer;"
  523. effect="dark"
  524. placement="top-start"
  525. v-if="formData.contract_type=='续约合同'||formData.contract_type=='新签合同'">
  526. <template #content>
  527. <div v-if="formData.contract_type=='续约合同'">
  528. 1、有正式转试用记录的客户,在申请转正时提交的合同<br>
  529. 2、所有客户在续约申请时提交的合同
  530. </div>
  531. <div v-if="formData.contract_type=='新签合同'">
  532. 没有正式转试用记录的客户,在申请转正时提交的合同
  533. </div>
  534. </template>
  535. <i class="el-icon-info"></i>
  536. </el-tooltip>
  537. </el-form-item>
  538. <el-form-item label="合同期限" prop="term" style="marginRight:60px;" :rules="{ required: true, message: '合同期限不能为空', trigger: 'blur' }" v-if="!isXClassCustom">
  539. <i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
  540. <el-date-picker
  541. v-model="formData.term"
  542. type="daterange"
  543. range-separator="至"
  544. start-placeholder="开始日期"
  545. end-placeholder="结束日期"
  546. @change="dateChange"
  547. value-format="YYYY-MM-DD"
  548. style="width:400px;">
  549. </el-date-picker>
  550. </el-form-item>
  551. <el-form-item label="合同期限" prop="term" :rules="{ required: true, message: '合同期限不能为空', trigger: 'change' }" style="marginRight:60px;" v-if="isXClassCustom">
  552. <i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
  553. <div class="quarters-content">
  554. <el-checkbox-group v-model="selectedQuarters" @input="checkboxInputHandler">
  555. <el-checkbox v-for="quarter in quarters" :key="quarter.value" :label="quarter.label" :disabled="isDisabled(quarter)" >
  556. {{ quarter.label }}
  557. </el-checkbox>
  558. </el-checkbox-group>
  559. <div v-if="selectedQuarters.length > 0" class="quarters-text">
  560. {{ selectedDateRange }}
  561. </div>
  562. </div>
  563. </el-form-item>
  564. <el-form-item label="合同金额" prop="amount" style="marginRight:60px;">
  565. <i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
  566. <el-input
  567. v-model.number="formData.amount"
  568. placeholder="请输入金额"
  569. style="width:400px"
  570. clearable></el-input>
  571. <span style="color:#666;">元</span>
  572. </el-form-item>
  573. <el-form-item label="付款方式" prop="payway" style="marginRight:60px;">
  574. <i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
  575. <el-select v-model="formData.payway" placeholder="请选择付款方式" style="width:400px;" clearable>
  576. <el-option
  577. v-for="item in ['月付','季付','半年付','年付','两年付','三年付']"
  578. :key="item"
  579. :label="item"
  580. :value="item">
  581. </el-option>
  582. </el-select>
  583. </el-form-item>
  584. <el-form-item label="付款渠道" prop="payfrom">
  585. <i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
  586. <el-input
  587. v-model="formData.payfrom"
  588. placeholder="填写代支付的渠道名称,没有可以填无"
  589. style="width:400px"
  590. clearable></el-input>
  591. </el-form-item>
  592. <el-form-item label="套餐类型" prop="setmeal" style="display:block;" :rules="{ required: true, message: '请选择套餐',trigger: 'change' }" v-if="companyInfo.CompanyType=='ficc' || isRoleType== 'ficc'">
  593. <i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
  594. <el-radio-group v-model="formData.setmeal" @change="setmealChange">
  595. <el-radio :label="1">大套餐</el-radio>
  596. <el-radio :label="2">小套餐</el-radio>
  597. </el-radio-group>
  598. </el-form-item>
  599. <el-form-item class="textarea_item" style="width:97%;paddingLeft:26px;" prop="CheckList">
  600. <label style="display:block;marginBottom:10px;fontSize:16px;position:relative;color:#666;">
  601. <i style="color:#f00;fontSize:20px;position:absolute;left:-15px;top:10%;">*</i>
  602. 权限设置
  603. </label>
  604. <template v-if="(companyInfo.CompanyType=='权益' || isRoleType== '权益') && !isXClassCustom" >
  605. <raiPermissionbox ref="raiPermissionboxRef" v-for="item in authList" :key="item.ClassifyName" :data="item" :formData="formData"
  606. :hasNoChild="hasNoChild"></raiPermissionbox>
  607. </template>
  608. <ul class="menu_lists" style="width:100%" v-else>
  609. <li v-for="item in authList" :key="item.ClassifyName" class="menu_item">
  610. <el-checkbox :indeterminate="item.isIndeterminate" v-model="item.checkAll" :disabled="setSelectVarietyDisabled(item)" @change="handleCheckAll(item)" style="marginRight:30px;fontWeight:bold;minWidth:90px;">{{item.ClassifyName+':'}}</el-checkbox>
  611. <el-checkbox-group v-model="item.CheckList" @change="handleChecked(item)">
  612. <el-checkbox v-for="list in item.Items" :label="list.ChartPermissionId" :key="list.ChartPermissionId" class="list_item" :disabled="list.IsPublic==1 || list.disabled">{{list.PermissionName}}</el-checkbox>
  613. </el-checkbox-group>
  614. </li>
  615. </ul>
  616. </el-form-item>
  617. <el-form-item prop="imglist" style="width:97%;paddingLeft:26px;" class="textarea_item">
  618. <label style="display:block;marginBottom:10px;fontSize:16px;position:relative;color:#666;">
  619. <i style="color:#f00;fontSize:20px;position:absolute;left:-15px;top:10%;">*</i>
  620. 上传合同附件<span style="fontSize:12px;color:#f00;">(建议上传盖章后的合同,支持png、jpg、pdf格式)</span>
  621. <input type="file" name="file" @change="fileSelected()" id="file" class="true-file" style="display:none;">
  622. <el-button type="primary" size="default" @click="clickinput('')" style="marginLeft:20px;" :loading="uploadloading">点击上传</el-button>
  623. </label>
  624. <ul class="img_cont">
  625. <li v-for="(img,index) in formData.imglist" :key="img" class="img_item">
  626. <!-- <el-image :src="img" alt="" style="background:#aaa;width:240px;height:180px;" :preview-src-list="formData.imglist" :id="'img'+index"/> -->
  627. <pdf ref="pdf" :src="img" style="width:240px;height:180px;overflow:hidden" v-if="img.indexOf('.pdf')!=-1" @click="preview('img'+index,index,img)"></pdf>
  628. <el-image :src="img" alt="" style="background:#aaa;width:240px;height:180px;" :id="'img'+index" v-else @click="preview('img'+index,index,img)"/>
  629. <i class="el-icon-zoom-in" style="position:absolute;right:12px;top:12px;color:#fff;" @click="preview('img'+index,index,img)"></i>
  630. <span style="position:absolute;right:12px;bottom:12px;color:#409EFF;fontSize:16px;cursor:pointer;" @click.stop="clickinput(index+1)">重新上传</span>
  631. </li>
  632. </ul>
  633. </el-form-item>
  634. </el-form>
  635. </div>
  636. </div>
  637. <div class="bot_cont">
  638. <div style="display:flex;justify-content:center;margin:80px 0 30px;">
  639. <el-button type="primary" style="width:80px;marginRight:24px;" @click="saveHandle">提交</el-button>
  640. <el-button type="primary" plain style="width:80px;" @click="cancelHandle">取消</el-button>
  641. </div>
  642. </div>
  643. <!-- 图片预览 -->
  644. <imgPreview
  645. :isShowToggle="isShowToggle"
  646. :isPreview="isPreviewimg"
  647. :arr="formData.imglist"
  648. :actIndex="preAct"
  649. @close="closePreview"
  650. @togglePre="togglePre"
  651. ></imgPreview>
  652. </div>
  653. </div>
  654. </template>
  655. <style scoped lang="scss">
  656. .applyTurn_container {
  657. /* min-width: 1570px; */
  658. *{box-sizing: border-box;}
  659. /* reset */
  660. :deep(.el-form-item .el-checkbox-group) {
  661. height: 40px;
  662. }
  663. :deep(.textarea_item .el-form-item__content) {
  664. width: 100%;
  665. }
  666. /* */
  667. .card_cont {
  668. margin-bottom: 20px;
  669. border: 1px solid #ECECEC;
  670. padding: 30px;
  671. background: #fff;
  672. border-radius: 4px;
  673. box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
  674. .info {
  675. margin-top: 10px;
  676. font-size: 16px;
  677. color: #666;
  678. .tit {
  679. color: #333;
  680. font-size: 16px;
  681. margin-bottom: 30px;
  682. }
  683. .info_list {
  684. display: flex;
  685. flex-wrap: wrap;
  686. padding-left: 50px;
  687. padding-bottom: 20px;
  688. li {
  689. margin-right: 113px;
  690. margin-bottom: 20px;
  691. min-width: 250px;
  692. }
  693. }
  694. }
  695. .apply_info {
  696. font-size: 16px;
  697. .info_cont {
  698. padding-left: 30px;
  699. margin-top: 30px;
  700. }
  701. }
  702. .menu_lists {
  703. padding: 40px 18px;
  704. border: 1px dashed #AAB4CC;
  705. border-radius: 4px;
  706. .menu_item {
  707. display: flex;
  708. // align-items: center;
  709. margin-bottom: 40px;
  710. &:last-child {
  711. margin-bottom: 0;
  712. }
  713. .list_item {
  714. margin-right: 30px;
  715. &:last-child {
  716. margin-right: 0;
  717. }
  718. }
  719. }
  720. }
  721. .img_cont {
  722. width: 100%;
  723. display: flex;
  724. flex-wrap: wrap;
  725. .img_item {
  726. position: relative;
  727. margin-right: 23px;
  728. &:last-child {
  729. margin-right: 0;
  730. }
  731. }
  732. }
  733. }
  734. .quarters-content {
  735. position: relative;
  736. .quarters-text {
  737. position: absolute;
  738. left: 0;
  739. top: 20px;
  740. color: #f00;
  741. }
  742. }
  743. }
  744. </style>