teamSoundMoney.vue 89 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736
  1. <template>
  2. <div class="sound-container">
  3. <div class="topMsg">
  4. <p>当前选择声部数(个):{{chioseSoundNum}}</p>
  5. <p style="margin-left:30px;">计划招生人数(个):{{PlannedCount}}</p>
  6. </div>
  7. <div class="listWrap">
  8. <el-table :data="activeSoundList"
  9. ref="multipleTable"
  10. :header-cell-style="{background:'#EDEEF0',color:'#444'}"
  11. highlight-current-row
  12. @selection-change="handleSelectionChange"
  13. @row-click="handleclick">
  14. <el-table-column type="selection"
  15. width="55"></el-table-column>
  16. <el-table-column label="声部"
  17. align="center"
  18. width="80"
  19. prop="sound"></el-table-column>
  20. <el-table-column label="计划招生"
  21. align="center"
  22. width="100"
  23. prop="jihua">
  24. <template slot-scope="scope"
  25. width="100">
  26. <div>
  27. <el-input v-if="scope.row.type == 1"
  28. @mousewheel.native.prevent
  29. type="number"
  30. style="width:80px"
  31. :disabled='teamStatus == "teamAudit"'
  32. size="mini"
  33. v-model.trim="scope.row.jihua"
  34. placeholder="请输入"></el-input>
  35. </div>
  36. </template>
  37. </el-table-column>
  38. <!-- <el-table-column label="乐团课程费用"
  39. width="120"
  40. align="center"
  41. prop="yuji">
  42. <template slot-scope="scope">
  43. <div>
  44. <el-input v-if="scope.row.type == 1"
  45. @mousewheel.native.prevent
  46. type="number"
  47. style="width:80px"
  48. size="mini"
  49. v-model.trim="scope.row.yuji"
  50. placeholder="请输入"></el-input>
  51. </div>
  52. </template>
  53. </el-table-column> -->
  54. <el-table-column label="可选乐器规格"
  55. align="center"
  56. prop="zhonglei"
  57. width="300">
  58. <template slot-scope="scope">
  59. <!-- 'typeVisible':false,'provideVisible':false,'markVisible':false -->
  60. <div>
  61. <span>{{scope.row.zhonglei | zhongleiFilter(scope.row.goodsList)}}</span>
  62. <el-popover placement="bottom"
  63. @show="chioseType(scope.row)"
  64. v-model.trim="scope.row.typeVisible"
  65. v-if="scope.row.type == 1">
  66. <el-button type="text"
  67. v-if='teamStatus != "teamAudit"'
  68. slot="reference">修改</el-button>
  69. <!-- zhonglei -->
  70. <el-select v-model.trim="scope.row.zhonglei"
  71. multiple
  72. clearable
  73. filterable
  74. @change="changezhonglei(scope.row)"
  75. collapse-tags>
  76. <el-option v-for="(item,index) in scope.row.goodsList"
  77. :key="index"
  78. :label="item.name"
  79. :value="item.id"></el-option>
  80. </el-select>
  81. <div style="text-align: right; margin-top: 20px">
  82. <!-- <el-button size="mini"
  83. type="text"
  84. @click="closechioseType(scope.row)">取消</el-button>-->
  85. <el-button type="primary"
  86. size="mini"
  87. @click="scope.row.typeVisible = false">确定</el-button>
  88. </div>
  89. </el-popover>
  90. </div>
  91. </template>
  92. </el-table-column>
  93. <el-table-column label="乐器提供方式"
  94. width="300"
  95. align="center"
  96. prop="fangshi">
  97. <template slot-scope="scope">
  98. <div>
  99. <!-- <div class="chiose" white-space:pre;
  100. >选择</div>-->
  101. <div v-if="scope.row.fangshi.length >0">{{scope.row.fangshi | fangshiFilter(scope.row)}}</div>
  102. <i class="el-icon-edit"
  103. v-if='teamStatus != "teamAudit"'
  104. @click="setGiveMode(scope.row)"></i>
  105. </div>
  106. </template>
  107. </el-table-column>
  108. <el-table-column label="教辅组合"
  109. align="center"
  110. prop="jiaopu">
  111. <template slot-scope="scope">
  112. <div>
  113. <el-dialog :visible.sync="scope.row.markVisible"
  114. style="text-align:left;"
  115. width="60%">
  116. <el-button type="text"
  117. @click="addMark(scope.row)">添加教辅</el-button>
  118. <div class="markWrap">
  119. <div class="markItem"
  120. v-for="(item, index) in scope.row.markList"
  121. :key="index">
  122. <el-form :model="item"
  123. :inline="true">
  124. <el-form-item label="教辅名称">
  125. <el-input type="text"
  126. v-model.trim="item.name"></el-input>
  127. </el-form-item>
  128. <el-form-item label="教辅商品">
  129. <el-select v-model.trim="item.goods"
  130. clearable
  131. filterable
  132. multiple
  133. collapse-tags>
  134. <el-option v-for="(item,index) in scope.row.markChioseList"
  135. :key="index"
  136. :label="item.name"
  137. :value="item.id"></el-option>
  138. </el-select>
  139. </el-form-item>
  140. <el-form-item label="教辅打包价">
  141. <el-input type="number"
  142. @mousewheel.native.prevent
  143. v-model.trim="item.price"></el-input>
  144. </el-form-item>
  145. <el-form-item>
  146. <el-button type="danger"
  147. icon="el-icon-delete"
  148. circle
  149. @click="removeMartItem(scope.row,index)"></el-button>
  150. </el-form-item>
  151. </el-form>
  152. </div>
  153. </div>
  154. <span slot="footer"
  155. class="dialog-footer">
  156. <el-button type="primary"
  157. @click="scope.row.markVisible = false">确 定</el-button>
  158. </span>
  159. </el-dialog>
  160. <span>
  161. <!-- &&item.name -->
  162. <span v-if="scope.row.markChioseList.length>0"
  163. v-for="(item,index) in scope.row.markList"
  164. :key="index">{{item.name?item.name+':':''}}{{item.goods|goodsFilter(scope.row.markChioseList)}}{{' 价格 '+item.price }}</span>
  165. </span>
  166. <i class="el-icon-edit"
  167. v-if='teamStatus != "teamAudit"'
  168. slot="reference"
  169. @click="chioseMark(scope.row)"></i>
  170. </div>
  171. </template>
  172. </el-table-column>
  173. <!-- <el-table-column label="操作">
  174. <template slot-scope="scope">
  175. <div>
  176. <el-button v-if='scope.row.type == 2'
  177. type="text"
  178. @click="savecolumn(scope.row)">编辑</el-button>
  179. <el-button v-if='scope.row.type == 1'
  180. type="text"
  181. @click="savecolumn(scope.row)">保存</el-button>
  182. </div>
  183. </template>
  184. </el-table-column>-->
  185. <el-table-column label="预览"
  186. align="center"
  187. prop="sound">
  188. <template slot-scope="scope">
  189. <div>
  190. <el-button type="text"
  191. @click="lookPreview(scope.row)">预览</el-button>
  192. </div>
  193. </template>
  194. </el-table-column>
  195. </el-table>
  196. <div class="floor">
  197. <div class="remove"
  198. @click="removeListItem">删除</div>
  199. <div class="add"
  200. @click="addListItem">添加</div>
  201. </div>
  202. </div>
  203. <el-dialog title="声部选择"
  204. :visible.sync="dialogTableVisible"
  205. :modal-append-to-body="false">
  206. <div class="soundWrap">
  207. <div class="itemList">
  208. <div class="categroy"
  209. v-for="(item,index) in soundList"
  210. :key="index">
  211. <p>{{item.name }}</p>
  212. <el-checkbox-group v-model.trim="soundLists[index]"
  213. @change="changeList">
  214. <!-- sound: this.activeSoundList[item].name, // id
  215. jihua: '10', //计划招生人数
  216. yuji: '10', // 预计收费
  217. zhonglei: [], // 可选乐器种类
  218. fangshi: 2, // 乐器提供方式
  219. jiaopu: 'jiaopu1', // 教辅组合
  220. type: 1, // 操作
  221. id: this.activeSoundList[item].id, //声部id
  222. visible: false, // 当前乐器提供方式的pop提示框显示隐藏-->
  223. <!-- changeSoundList -->
  224. <el-checkbox :label="sound.id"
  225. @change="(val)=>{changeSoundList(val,sound,soundLists[index])}"
  226. v-for="(sound,indexs) in item.subjects"
  227. :key="indexs">{{sound.name }}</el-checkbox>
  228. </el-checkbox-group>
  229. </div>
  230. </div>
  231. </div>
  232. <p class="soundSubP">当前选择声部数:{{chioseSoundNum}}</p>
  233. <div class="btnWraps">
  234. <div class="dialogBtn"
  235. @click="generates">确定</div>
  236. </div>
  237. </el-dialog>
  238. <div class="btnWrap">
  239. <div class="PrevBtn"
  240. @click="goback">上一步</div>
  241. <div class="submitBtn"
  242. v-permission="{child: 'musicGroup/auditSuccess', parent: '/teamBuild/teamAudit/soundMoney'}"
  243. v-if="teamStatus == 'teamAudit'"
  244. @click="approval">审核通过</div>
  245. <div class="submitBtn"
  246. v-permission="{child: 'musicGroup/auditFailed', parent: '/teamBuild/teamAudit/soundMoney'}"
  247. v-if="teamStatus == 'teamAudit'"
  248. @click="refuse">拒绝</div>
  249. <div class="submitBtn"
  250. v-permission="{child: 'musicGroup/createGroup', parent: '/teamBuild/soundMoney'}"
  251. v-if="teamStatus != 'teamAudit'"
  252. @click="submitInfo(1)">保存</div>
  253. <div class="submitBtn"
  254. v-permission="{child: 'musicGroup/createGroup', parent: '/teamBuild/soundMoney'}"
  255. v-if="teamStatus != 'teamAudit'"
  256. @click="submitInfo(2)">提交审核</div>
  257. </div>
  258. <el-dialog title="乐团预览"
  259. :visible.sync="previewVisible"
  260. :close-on-click-modal="false"
  261. @close="onPreviewClose"
  262. width="450px">
  263. <div class="reductionWrap1 reductionWrap">
  264. <header style="background:#14928A;color:#fff">乐团缴费</header>
  265. <div class="noticeInfo">
  266. <h2>缴费说明</h2>
  267. 1、为确保声部平衡,请家长确认 注册声部为孩子的最终录取声部。<br />
  268. 2、为保障每个声部人数达标,我们都进行了超员20%的录取,系统将按照提交注册的先后顺序安排名额。超员后 有可能出现无法注册的情况,请您理解。如果其他声部仍有名额,我们将优先调配您的孩子;
  269. <div class="line_bottom"
  270. style="margin: 20px 0 0;"></div>
  271. </div>
  272. <!-- && (courseScheduleStatus || musicGroupSubject.fee > 0) -->
  273. <div class="section"
  274. v-if="courseScheduleInfo ">
  275. <h2 class="title"
  276. style="padding: 0 16px;">乐团课程</h2>
  277. <div class="options classInfo"
  278. style="padding:8px 16pxm 0;">
  279. <div class="option"
  280. v-if="courseScheduleInfo.soundInfo.ischeck"
  281. @click="onCourseChange(courseScheduleInfo.soundInfo)">
  282. <div class="o_hd"><i class="check_radio"></i></div>
  283. <div class="o_bd">乐团声部训练</div>
  284. <span class="o_ft">
  285. 价格:¥{{ courseScheduleInfo.soundInfo.value ? courseScheduleInfo.soundInfo.value : 0 }}
  286. </span>
  287. </div>
  288. <div class="option"
  289. v-if="courseScheduleInfo.allInfo.ischeck"
  290. @click="onCourseChange(courseScheduleInfo.allInfo)">
  291. <div class="o_hd"><i class="check_radio"></i></div>
  292. <div class="o_bd">乐团合奏训练</div>
  293. <span class="o_ft">
  294. 价格:¥{{ courseScheduleInfo.allInfo.value ? courseScheduleInfo.allInfo.value : 0 }}
  295. </span>
  296. </div>
  297. <div class="option"
  298. v-if="courseScheduleInfo.holidayInfo.ischeck"
  299. @click="onCourseChange(courseScheduleInfo.holidayInfo)">
  300. <div class="o_hd"><i class="check_radio"></i></div>
  301. <div class="o_bd">假期集中训练</div>
  302. <span class="o_ft">
  303. 价格:¥{{ courseScheduleInfo.holidayInfo.value ? courseScheduleInfo.holidayInfo.value : 0 }}
  304. </span>
  305. </div>
  306. <div class="option"
  307. v-if="courseScheduleInfo.networkInfo && courseScheduleInfo.networkInfo.ischeck"
  308. @click="onCourseChange(courseScheduleInfo.networkInfo)">
  309. <div class="o_hd"><i class="check_radio"></i></div>
  310. <div class="o_bd">乐团云课堂</div>
  311. <span class="o_ft">
  312. 价格:¥{{ courseScheduleInfo.networkInfo.value ? courseScheduleInfo.networkInfo.value : 0 }}
  313. </span>
  314. </div>
  315. <div class="option"
  316. v-if="courseScheduleInfo.baseInfo.ischeck"
  317. @click="onCourseChange(courseScheduleInfo.baseInfo)">
  318. <div class="o_hd"><i class="check_radio"></i></div>
  319. <div class="o_bd">网络基础训练</div>
  320. <span class="o_ft">
  321. 价格:¥{{ courseScheduleInfo.baseInfo.value ? courseScheduleInfo.baseInfo.value : 0 }}
  322. </span>
  323. </div>
  324. </div>
  325. <div class="options sale"
  326. style="padding: 8px 16px 10px;"
  327. v-if="lookPreviewRow&&lookPreviewRow.yuji.toString()"
  328. :class="[courseScheduleStatus?'lines':'']">
  329. <div class="option">
  330. <div class="o_bd"></div>
  331. <span class="o_ft">现价¥{{ orderInfo.coursePrice }}</span>
  332. </div>
  333. </div>
  334. <div class="coutInfo"
  335. v-if="courseScheduleInfo.submit.ischeck">
  336. <i class="trumpet_icon"></i>
  337. {{ courseScheduleInfo.submit.value }}
  338. </div>
  339. </div>
  340. <div class="section"
  341. v-if="newStudentfor.baseInfo.ischeck">
  342. <h2 class="title">新生专享</h2>
  343. <div class="options classInfo">
  344. <div class="option"
  345. v-if="newStudentfor.baseInfo.ischeck"
  346. @click="onCourseChange(newStudentfor.baseInfo)">
  347. <div class="o_hd"><i class="check_default"
  348. :class="[newStudentfor.baseInfo.isStatus ? 'check_active' : '']"></i></div>
  349. <div class="o_bd">网络基础训练</div>
  350. <span class="o_ft">
  351. 价格:¥{{ newStudentfor.baseInfo.nowValue ? newStudentfor.baseInfo.nowValue : 0 }}
  352. </span>
  353. </div>
  354. </div>
  355. <!-- v-if="lookPreviewRow&&lookPreviewRow.yuji" -->
  356. <div class="options sale"
  357. style="padding: 8px 16px 10px;"
  358. :class="[courseScheduleStatus?'lines':'']">
  359. <div class="option">
  360. <div class="o_bd"></div>
  361. <!-- 以后要加课程这里得计算课程 -->
  362. <span class="o_ft">现价¥{{ newStudentfor.baseInfo.value }}</span>
  363. </div>
  364. </div>
  365. <!-- <div class="coutInfo"
  366. style="width:100%">
  367. <i class="trumpet_icon"></i>
  368. 该课程不支持退款
  369. </div> -->
  370. </div>
  371. <div class="section"
  372. v-if="lookPreviewRow&&lookPreviewRow.fangshi.length > 0">
  373. <h2 class="title ">乐器</h2>
  374. <div class="options">
  375. <div v-for="(con, index) in lookPreviewRow.fangshi"
  376. @click="instrumentF(con)"
  377. :key="index"
  378. :class="[ lookPreviewRow.fangshi.length > 1 ? 'oc' : '' ]">
  379. <div class="option"
  380. v-if="con.mode.isGROUP"
  381. @click="con.chiosetype='GROUP'">
  382. <!-- :class="[ con.checked ? 'check_active' : '' ]" -->
  383. <div class="o_">
  384. <i class="check_default"
  385. :class="[ con.chiosetype=='GROUP'&&con.checked ? 'check_active' : '' ]"></i>
  386. </div>
  387. <div class="o_bd">{{ con.shopName }}</div>
  388. <span class="nowPrice">
  389. 价格:<del>¥{{ con.mode.marketPrice }}</del>
  390. <!-- <del></del> -->
  391. <!-- 现价:¥{{ (con.mode.price - con.mode.GROUP).toFixed(2) }} -->
  392. </span>
  393. </div>
  394. <!-- v-if="con.marketPrice" -->
  395. <div v-if="con.mode.isGROUP"
  396. class="configuration">
  397. <div class="config config_line">
  398. <div class="title">
  399. <span>配置参数</span>
  400. </div>
  401. <div class="content">
  402. <template v-for="(goods, index) in lookPreviewRow.goodsList">
  403. <p :key="goods.id"
  404. v-if="con.id == goods.id">{{ lookPreviewRow.goodsList[index].specification }}</p>
  405. </template>
  406. </div>
  407. </div>
  408. <div class="nowMoney">
  409. <span class="title">现价</span> <span class="dot">¥</span>{{ (con.mode.price - con.mode.GROUP).toFixed(2) }}
  410. </div>
  411. <!-- // 现价 -->
  412. </div>
  413. <div class="option"
  414. v-if="(con.mode.isLEASE)"
  415. @click="con.chiosetype='LEASE'">
  416. <!-- :class="[ con.checked ? 'check_active' : '' ]" -->
  417. <div class="o_">
  418. <i class="check_default"
  419. :class="[ con.chiosetype=='LEASE'&&con.checked ? 'check_active' : '' ]"></i>
  420. </div>
  421. <div class="o_bd">{{ con.shopName }}</div>
  422. <template>
  423. <!-- <span class="o_ft">
  424. 押金:¥{{ (con.mode.depositFee).toFixed(2) }}
  425. </span> -->
  426. </template>
  427. </div>
  428. <div class="option"
  429. v-if="(con.mode.isNull)"
  430. @click="con.chiosetype='Null'">
  431. <!-- :class="[ con.checked ? 'check_active' : '' ]" -->
  432. <div class="o_">
  433. <i class="check_default"
  434. :class="[ con.chiosetype=='Null'&&con.checked ? 'check_active' : '' ]"></i>
  435. </div>
  436. <div class="o_bd">自备</div>
  437. <template>
  438. <!-- <span class="o_ft">
  439. 押金:¥{{ (con.mode.depositFee).toFixed(2) }}
  440. </span> -->
  441. </template>
  442. </div>
  443. <!-- v-if="con.marketPrice" -->
  444. <div class="configuration"
  445. v-if="(con.mode.isLEASE)">
  446. <div class="config config_line">
  447. <div class="title">
  448. <span>配置参数</span>
  449. </div>
  450. <div class="content">
  451. <!-- <p>{{ lookPreviewRow.goodsList[index].specification }}</p> -->
  452. <template v-for="(goods, index) in lookPreviewRow.goodsList">
  453. <p :key="goods.id"
  454. v-if="con.id == goods.id">{{ lookPreviewRow.goodsList[index].specification }}</p>
  455. </template>
  456. </div>
  457. </div>
  458. <div class="nowMoney">
  459. <span class="title">押金</span> <span class="dot">¥:</span> {{ parseFloat(con.mode.depositFee).toFixed(2) }}
  460. </div>
  461. </div>
  462. <!-- 免费 -->
  463. <div class="option"
  464. v-if="con.mode.isFREE"
  465. @click="con.chiosetype='FREE'">
  466. <!-- :class="[ con.checked ? 'check_active' : '' ]" -->
  467. <div class="o_">
  468. <i class="check_default"
  469. :class="[ con.chiosetype=='FREE'&&con.checked ? 'check_active' : '' ]"></i>
  470. </div>
  471. <div class="o_bd">{{ con.shopName }}</div>
  472. <template>
  473. <span class="nowPrice">
  474. 价格:<del>¥{{ con.mode.marketPrice }}</del>
  475. </span>
  476. </template>
  477. </div>
  478. <!-- v-if="con.marketPrice" -->
  479. <div class="configuration"
  480. v-if="con.mode.isFREE">
  481. <div class="config config_line">
  482. <div class="title">
  483. <span>配置参数</span>
  484. </div>
  485. <div class="content">
  486. <!-- <p>{{ lookPreviewRow.goodsList[index].specification }}</p> -->
  487. <template v-for="(goods, index) in lookPreviewRow.goodsList">
  488. <p :key="goods.id"
  489. v-if="con.id == goods.id">{{ lookPreviewRow.goodsList[index].specification }}</p>
  490. </template>
  491. </div>
  492. </div>
  493. <div class="nowMoney">
  494. 免费领用
  495. </div>
  496. </div>
  497. </div>
  498. </div>
  499. </div>
  500. <div class="section"
  501. v-if="lookPreviewRow&&lookPreviewRow.markList&&lookPreviewRow.markList.length > 0"
  502. key="accessOries">
  503. <h2 class="title">辅件</h2>
  504. <div class="options"
  505. style="padding:0 16px;"
  506. v-for="(instr, index) in lookPreviewRow.markList"
  507. :key="index"
  508. @click="onAuxiliarie(instr)">
  509. <div class="option">
  510. <div class="o_hd">
  511. <i class="check_default"
  512. :class="[ instr.checked ? 'check_active' : '' ]"></i>
  513. </div>
  514. <div class="o_bd">{{ instr.name }}</div>
  515. <span class="o_ft">
  516. <!-- <del>价格:¥{{ instr.marketPrice }}</del> -->
  517. {{ instr.price == 0 ? '免费' : '现价:¥' + instr.price }}
  518. </span>
  519. </div>
  520. <div class="configuration">
  521. <div class="config config_other">
  522. <div class="title">
  523. <span>配置</span>
  524. </div>
  525. <div class="content "
  526. v-for="item in instr.goods"
  527. :key="item">
  528. <div class="option">
  529. <div class="o_bd">{{ item | AccessoryName(lookPreviewRow)}}</div>
  530. <span class="o_ft">¥{{ item | AccessoryPrice(lookPreviewRow)}}</span>
  531. </div>
  532. </div>
  533. </div>
  534. </div>
  535. </div>
  536. </div>
  537. <div class="section"
  538. v-else-if="accessGoods.length > 0"
  539. key="accessOries">
  540. <h2 class="title line_bottom">辅件</h2>
  541. <div class="options"
  542. style="padding:0 16px;"
  543. v-for="(instr, index) in accessGoods"
  544. :key="index">
  545. <div class="option">
  546. <div class="o_hd">
  547. <i class="check_default"
  548. :class="[ instr.checked ? 'check_active' : '' ]"></i>
  549. </div>
  550. <div class="o_bd">{{ instr.name }}</div>
  551. <span class="o_ft">
  552. <del>价格:¥{{ instr.marketPrice }}</del>
  553. {{ instr.groupPurchasePrice == 0 ? '免费' : '现价:¥' + instr.groupPurchasePrice }}
  554. </span>
  555. </div>
  556. </div>
  557. </div>
  558. <div class="section"
  559. v-if="otherResult.length > 0"
  560. key="otherResult">
  561. <h2 class="title line_bottom">其它</h2>
  562. <div class="options"
  563. style="padding:0 16px;"
  564. v-for="(base, index) in otherResult"
  565. :key="index">
  566. <div class="option">
  567. <div class="o_hd">
  568. <i class="check_default check_active"></i>
  569. </div>
  570. <div class="o_bd">{{ base.name }}</div>
  571. <span class="o_ft">
  572. <del>价格:¥{{ base.marketPrice }}</del>
  573. {{ base.price == 0 ? '免费' : '现价:¥' + base.price }}
  574. </span>
  575. </div>
  576. <div class="configuration">
  577. <div class="config config_other">
  578. <div class="title">
  579. <span>配置</span>
  580. </div>
  581. <div class="content"
  582. v-for="(item, index1) in base.goodsList"
  583. :key="index1">
  584. <div class="option">
  585. <div class="o_bd">{{ item.name }}</div>
  586. <span class="o_ft">¥{{ item.marketPrice }}</span>
  587. </div>
  588. </div>
  589. </div>
  590. </div>
  591. </div>
  592. </div>
  593. <div class="section"
  594. v-else-if="otherGoods.length > 0"
  595. key="otherResult">
  596. <h2 class="title line_bottom">其它</h2>
  597. <div class="options"
  598. v-for="base in otherGoods"
  599. :key="base.id">
  600. <div class="option">
  601. <div class="o_hd">
  602. <i class="check_default check_active"></i>
  603. </div>
  604. <div class="o_bd">{{ base.name }}</div>
  605. <span class="o_ft">
  606. <del>价格:¥{{ base.marketPrice }}</del>
  607. {{ base.groupPurchasePrice == 0 ? '免费' : '现价:¥' + base.groupPurchasePrice }}
  608. </span>
  609. </div>
  610. </div>
  611. </div>
  612. <div class="section">
  613. <div class="needprice markerprice">
  614. <del>价格</del>
  615. <del>¥{{ orderInfo.marketPrice }}</del>
  616. </div>
  617. <!-- <div class="needprice markerprice">
  618. <p>现价</p>
  619. <p>¥{{ orderInfo.groupPurchasePrice }}</p>
  620. </div> -->
  621. <!-- <div class="needprice markerprice" v-if="orderInfo.couponPrice > 0">
  622. <p>优惠</p>
  623. <p>¥{{ orderInfo.couponPrice }}</p>
  624. </div> -->
  625. <div class="needprice grouopprice">
  626. <span>仅需支付</span>
  627. <span>¥{{ orderInfo.amount }}</span>
  628. </div>
  629. </div>
  630. <div class="buy">
  631. <div class="price">
  632. <p class="use_price">
  633. <img class="logo"
  634. src="@/assets/images/mycard.png"
  635. alt />
  636. <span>¥{{ needPrice }}</span>
  637. </p>
  638. </div>
  639. <a class="btn-submit"
  640. @click="previewVisible=false">购买</a>
  641. </div>
  642. </div>
  643. </el-dialog>
  644. <el-dialog tilte="请选择乐器的提供方式及减免金额"
  645. width="800px"
  646. :visible.sync="reductionVisible">
  647. <div v-if="editSound&&editSound.fangshi.length >0">
  648. <div class="reductionWrap"
  649. v-for="(item,index) in editSound.fangshi"
  650. :key="index">
  651. <div class="lineWrap">
  652. <div class="item">{{ item.shopName}}</div>
  653. <div class="item">提供方式</div>
  654. <div class="item">提供方式对应金额</div>
  655. <div class="item">乐器费用减免</div>
  656. </div>
  657. <div class="lineWrap">
  658. <div class="item"></div>
  659. <div class="item">
  660. <el-checkbox v-model.trim="item.mode.isGROUP"
  661. :disabled="item.id==-1"></el-checkbox>团购
  662. </div>
  663. <div class="item">
  664. <el-input style="width:80%"
  665. type="number"
  666. @mousewheel.native.prevent
  667. v-model.trim="item.mode.price"
  668. disabled></el-input>
  669. </div>
  670. <!-- :disabled="item.id==-1" -->
  671. <div class="item">
  672. <el-input style="width:80%"
  673. type="number"
  674. @mousewheel.native.prevent
  675. v-model.trim="item.mode.GROUP"
  676. :disabled="true"
  677. @input="groupInput(item)"></el-input>
  678. </div>
  679. <!-- <div class="item">
  680. <el-input style="width:80%"
  681. type="number"
  682. @mousewheel.native.prevent
  683. v-model.trim="item.mode.courseGroup"
  684. :disabled="item.id==-1"
  685. @input="groupCourseInput(item)"></el-input>
  686. </div> -->
  687. </div>
  688. <div class="lineWrap">
  689. <div class="item"></div>
  690. <div class="item">
  691. <el-checkbox v-model.trim="item.mode.isLEASE"
  692. :disabled="item.id==-1"></el-checkbox>租赁
  693. </div>
  694. <div class="item">
  695. <el-input style="width:80%"
  696. type="number"
  697. @mousewheel.native.prevent
  698. :disabled="item.id==-1"
  699. @input="(val)=>{
  700. setDeposiInput(val,item)
  701. }"
  702. v-model.trim="item.mode.depositFee"></el-input>
  703. </div>
  704. <div class="item">
  705. <el-input style="width:80%"
  706. type="number"
  707. disabled
  708. @mousewheel.native.prevent
  709. @input="deposiInput(item)"
  710. v-model.trim="item.mode.LEASE"></el-input>
  711. </div>
  712. </div>
  713. <div class="lineWrap">
  714. <div class="item"></div>
  715. <div class="item">
  716. <el-checkbox v-model.trim="item.mode.isFREE"
  717. :disabled="item.id==-1"></el-checkbox>免费
  718. </div>
  719. <div class="item">
  720. <el-input style="width:80%"
  721. disabled></el-input>
  722. </div>
  723. <div class="item">
  724. <el-input style="width:80%"
  725. type="number"
  726. @mousewheel.native.prevent
  727. disabled></el-input>
  728. </div>
  729. </div>
  730. </div>
  731. </div>
  732. <div slot="footer"
  733. class="dialog-footer">
  734. <el-button type="primary"
  735. @click="resetSoundItem">确 定</el-button>
  736. </div>
  737. </el-dialog>
  738. </div>
  739. </template>
  740. <script>
  741. import store from "@/store";
  742. import { formatData } from '@/utils/utils'
  743. import {
  744. getSubject,
  745. getDefaultSubject,
  746. getGoods,
  747. createTeam,
  748. getSoundTree,
  749. findMusicGroupSubjectInfo,
  750. updateSubjectInfo,
  751. auditSuccess,
  752. auditFailed,
  753. getSubjectGoods
  754. } from "@/api/buildTeam";
  755. import dayjs from 'dayjs'
  756. export default {
  757. name: "teamSoundMoney",
  758. data () {
  759. return {
  760. reductionVisible: false,
  761. previewVisible: false, // 乐团预览
  762. dialogTableVisible: false,
  763. soundList: [],
  764. soundLists: [], // 存储选中项的声部id 记录变量
  765. activeSoundList: [], // 记录存储后的所选中的声部列表
  766. checkList: [],
  767. multipleSelection: [], // 列表选择的集合
  768. isLoop: "", // 是否显示周期循环
  769. payfor: {},
  770. topfor: {},
  771. checkfor: {},
  772. teamStatus: "",
  773. teamid: "",
  774. isNullFangshi: true,
  775. Fsearch: null,
  776. Frules: null,
  777. editSound: null,
  778. // 预览
  779. courseScheduleInfo: null, // 课程组信息
  780. newStundentInfo: null,
  781. instrumentResult: [], // 乐器信息
  782. accessOries: [], // 辅件(打包)
  783. accessGoods: [],
  784. otherResult: [], // 其它打包
  785. otherGoods: [], // 其它商品
  786. lookPreviewRow: null,
  787. courseScheduleStatus: true, // 有没有数据
  788. orderInfo: {
  789. marketPrice: 0,
  790. amount: 0, // 现价总金额
  791. goodsGroupIds: null,
  792. goodsIds: null,
  793. contractGoodsIds: null, // 选中所有商品ID
  794. couponPrice: 0, //
  795. groupPurchasePrice: 0
  796. }, // 金额列表,金额计算
  797. needPrice: 0,
  798. instr: { ischeck: false }
  799. };
  800. },
  801. created () {
  802. // 判断是否带缓存参数
  803. this.init();
  804. },
  805. mounted () {
  806. },
  807. activated () {
  808. // 判断是否带缓存参
  809. this.init();
  810. },
  811. methods: {
  812. onCourseChange (item) {
  813. // 判断用户是否可以选择
  814. if (item.checkBuy) {
  815. item.isStatus = !item.isStatus
  816. }
  817. this.calcPrice()
  818. },
  819. init () {
  820. if (this.$route.query.search) {
  821. this.Fsearch = this.$route.query.search;
  822. }
  823. if (this.$route.query.rules) {
  824. this.Frules = this.$route.query.rules;
  825. }
  826. // 获取
  827. getSoundTree({ tenantId: 1 }).then(res => {
  828. if (res.code == 200) {
  829. this.soundList = res.data.rows;
  830. // // 生成动态的checkList
  831. for (let key in this.soundList) {
  832. console.log(key)
  833. this.$set(this.soundLists, key, []);
  834. }
  835. // 新建团带默认的数据 this.topfor.section
  836. if (this.teamStatus == "newTeam") {
  837. getDefaultSubject({
  838. chargeTypeId: type,
  839. organId: this.topfor.section,
  840. number: 1
  841. }).then(res => {
  842. if (res.code == 200) {
  843. this.activeSoundList = res.data.map(item => {
  844. // this.soundLists[0].push(item.subjectId)
  845. let obj = {
  846. id: item.id,
  847. sound: item.name,
  848. jihua: item.expectedStudentNum,
  849. yuji: item.fee,
  850. zhonglei: [],
  851. fangshi: [],
  852. fangshiprice: item.depositFee,
  853. jiaopu: "",
  854. type: 1,
  855. typeVisible: false,
  856. provideVisible: false,
  857. markVisible: false,
  858. goodsList: [],
  859. markList: [],
  860. markChioseList: []
  861. };
  862. // this.checkinlist(obj);
  863. return obj;
  864. });
  865. // = arr;
  866. this.soundList.forEach((item, i) => {
  867. item.subjects.forEach((some, j) => {
  868. res.data.forEach((sub, x) => {
  869. if (sub.id == some.id) {
  870. this.soundLists[i].push(some.id);
  871. }
  872. });
  873. });
  874. });
  875. // 并且把所有soundLists 里面
  876. }
  877. });
  878. }
  879. // 修改带原有团的数据
  880. if (
  881. this.teamStatus == "teamDraft" ||
  882. this.teamStatus == "teamAudit"
  883. ) {
  884. // 获取第二页的数据
  885. this.teamid = this.$route.query.id;
  886. findMusicGroupSubjectInfo({ musicGroupId: this.teamid }).then(
  887. res => {
  888. if (res.code == 200) {
  889. this.activeSoundList = res.data.musicGroupSubjectPlans.map(
  890. item => {
  891. let fangshi = [];
  892. res.data.musicGroupSubjectGoodsGroups.forEach(sub => {
  893. if (
  894. sub.subjectId == item.subjectId &&
  895. sub.type == "INSTRUMENT"
  896. ) {
  897. let FREE, courseFree, LEASE, courseLease, GROUP, courseGroup;
  898. let isFREE = false;
  899. let isLEASE = false;
  900. let isGROUP = false;
  901. let depositFee = sub.depositFee;
  902. let price = sub.price;
  903. let marketPrice = sub.goodsList[0].marketPrice;
  904. if (sub.kitGroupPurchaseTypeJson) {
  905. let expectJson = JSON.parse(
  906. sub.kitGroupPurchaseTypeJson
  907. );
  908. if (expectJson && expectJson.hasOwnProperty("FREE")) {
  909. FREE = expectJson.FREE;
  910. isFREE = true;
  911. }
  912. if (expectJson && expectJson.hasOwnProperty("LEASE")) {
  913. LEASE = expectJson.LEASE;
  914. isLEASE = true;
  915. }
  916. if (expectJson && expectJson.hasOwnProperty("GROUP")) {
  917. GROUP = expectJson.GROUP;
  918. isGROUP = true;
  919. }
  920. }
  921. if (sub.coursePurchaseTypeJson) {
  922. let courseJson = JSON.parse(sub.coursePurchaseTypeJson)
  923. if (courseJson && courseJson.hasOwnProperty("FREE")) {
  924. courseFree = courseJson.FREE;
  925. }
  926. if (courseJson && courseJson.hasOwnProperty("LEASE")) {
  927. courseLease = courseJson.LEASE;
  928. }
  929. if (courseJson && courseJson.hasOwnProperty("GROUP")) {
  930. courseGroup = courseJson.GROUP;
  931. }
  932. }
  933. fangshi.push({
  934. shopName: sub.name,
  935. id: sub.goodsIdList,
  936. mode: {
  937. courseFree: courseFree || 0,
  938. courseLease: courseLease || null,
  939. courseGroup: courseGroup || 0,
  940. yuji: item.fee,
  941. FREE: FREE || 0,
  942. GROUP: GROUP || 0,
  943. LEASE: LEASE || null,
  944. depositFee: depositFee || 0, // 保证金
  945. price: price || 0, // 团购价
  946. marketPrice: marketPrice || 0, // 商品原价
  947. isFREE: isFREE,
  948. isGROUP: isGROUP,
  949. isLEASE: isLEASE
  950. }
  951. });
  952. }
  953. });
  954. let obj = {
  955. id: item.subjectId,
  956. sound: item.subName,
  957. jihua: item.expectedStudentNum,
  958. yuji: item.fee,
  959. zhonglei: [],
  960. fangshi: fangshi,
  961. fangshiprice: item.depositFee,
  962. jiaopu: "",
  963. type: 1,
  964. typeVisible: false,
  965. provideVisible: false,
  966. markVisible: false,
  967. goodsList: [],
  968. markList: [],
  969. markChioseList: []
  970. };
  971. this.checkinlist(obj);
  972. return obj;
  973. }
  974. );
  975. // this.activeSoundList = arr;
  976. // 这里.....
  977. this.soundList.forEach((item, i) => {
  978. item.subjects.forEach((some, j) => {
  979. this.activeSoundList.forEach((sub, x) => {
  980. if (sub.id == some.id) {
  981. this.soundLists[i].push(some.id);
  982. this.soundLists[i] = [...new Set(this.soundLists[i])]
  983. // this.checkinlist(some)
  984. // this.activeSoundList.push(some)
  985. // 这里点击勾选
  986. }
  987. });
  988. });
  989. });
  990. // 循环列表里的声部 拿取商品
  991. for (let i in this.activeSoundList) {
  992. for (let j in res.data.musicGroupSubjectGoodsGroups) {
  993. if (
  994. this.activeSoundList[i].id ==
  995. res.data.musicGroupSubjectGoodsGroups[j].subjectId
  996. ) {
  997. //
  998. if (
  999. res.data.musicGroupSubjectGoodsGroups[j].type ==
  1000. "INSTRUMENT"
  1001. ) {
  1002. this.activeSoundList[
  1003. i
  1004. ].zhonglei = this.activeSoundList[i].zhonglei.concat(
  1005. res.data.musicGroupSubjectGoodsGroups[j].goodsIdList
  1006. );
  1007. this.activeSoundList[
  1008. i
  1009. ].zhonglei = this.activeSoundList[i].zhonglei.map(
  1010. item => {
  1011. return parseInt(item);
  1012. }
  1013. );
  1014. this.activeSoundList[
  1015. i
  1016. ].goodsList = this.activeSoundList[
  1017. i
  1018. ].goodsList.concat(
  1019. res.data.musicGroupSubjectGoodsGroups[j].goodsList
  1020. );
  1021. // goodsList
  1022. }
  1023. // 拿辅件
  1024. if (
  1025. res.data.musicGroupSubjectGoodsGroups[j].type ==
  1026. "ACCESSORIES"
  1027. ) {
  1028. if (
  1029. res.data.musicGroupSubjectGoodsGroups[j].goodsList
  1030. .length >= 0
  1031. ) {
  1032. this.activeSoundList[i].markList
  1033. ? this.activeSoundList[i].markList
  1034. : (this.activeSoundList[i].markList = []);
  1035. let obj = {};
  1036. obj.goods = res.data.musicGroupSubjectGoodsGroups[
  1037. j
  1038. ].goodsIdList.split(",");
  1039. obj.goods = obj.goods.map(item => {
  1040. return parseInt(item);
  1041. });
  1042. obj.name =
  1043. res.data.musicGroupSubjectGoodsGroups[j].name;
  1044. obj.price =
  1045. res.data.musicGroupSubjectGoodsGroups[j].price;
  1046. this.activeSoundList[i].markList.push(obj);
  1047. // this.activeSoundList[i].markList.goodsList.goods = JSON.parse(res.data.musicGroupSubjectGoodsGroups[j].goodsIdList)
  1048. this.activeSoundList[
  1049. i
  1050. ].markChioseList = this.activeSoundList[
  1051. i
  1052. ].markChioseList.concat(
  1053. res.data.musicGroupSubjectGoodsGroups[j].goodsList
  1054. );
  1055. }
  1056. }
  1057. }
  1058. }
  1059. }
  1060. }
  1061. }
  1062. );
  1063. }
  1064. }
  1065. });
  1066. // 拿到刚才的存储的信息
  1067. this.payfor = this.$store.getters.payList;
  1068. this.topfor = this.$store.getters.topinfo;
  1069. this.checkfor = this.$store.getters.checkinfo;
  1070. this.newStudentfor = this.$store.getters.newStudentinfo
  1071. this.$nextTick(res => {
  1072. let tempInfo = this.$store.getters.checkinfo
  1073. // 默认课程都选中
  1074. for (let i in tempInfo) {
  1075. if (tempInfo[i] && !tempInfo[i].isNew) {
  1076. tempInfo[i].isStatus = true
  1077. } else {
  1078. tempInfo[i].isStatus = false
  1079. }
  1080. }
  1081. // 默认选中新生专享
  1082. for (let i in this.newStudentfor) {
  1083. if (this.newStudentfor[i] && this.newStudentfor[i].isNew) {
  1084. this.newStudentfor[i].isStatus = false
  1085. } else {
  1086. this.newStudentfor[i].isStatus = false
  1087. }
  1088. }
  1089. this.courseScheduleInfo = tempInfo;
  1090. });
  1091. let type = this.topfor.type;
  1092. // 判断进来的乐团状态
  1093. this.teamStatus = this.$route.query.type;
  1094. },
  1095. // 改变checkbox
  1096. changeList (e) {
  1097. // console.log(e)
  1098. },
  1099. changeSoundList (e, sound, arr) {
  1100. if (e) {
  1101. this.checkinlist({ 'id': sound.id, 'sound': sound.name, 'jihua': 0, 'yuji': 0, 'zhonglei': [], 'fangshi': [], 'fangshiprice': 1500, 'jiaopu': '', 'type': 1, 'typeVisible': false, 'provideVisible': false, 'markVisible': false, 'goodsList': [], 'markList': [], 'markChioseList': [] })
  1102. } else {
  1103. this.activeSoundList.some((item, index) => {
  1104. if (sound.id === item.id) {
  1105. this.activeSoundList.splice(index, 1)
  1106. }
  1107. })
  1108. }
  1109. },
  1110. handleSelectionChange (e) {
  1111. // 点击改变勾选
  1112. this.multipleSelection = e;
  1113. },
  1114. handleclick (e) { },
  1115. handleStatus (data) { },
  1116. // 点击添加按钮
  1117. addListItem () {
  1118. this.dialogTableVisible = true;
  1119. },
  1120. // 点击确认按钮生成表单
  1121. generates () {
  1122. this.dialogTableVisible = false;
  1123. },
  1124. removeListItem () {
  1125. this.$confirm(`是否删除该声部?`, "提示", {
  1126. confirmButtonText: "确定",
  1127. cancelButtonText: "取消",
  1128. type: "warning"
  1129. })
  1130. .then(() => {
  1131. this.$nextTick(res => {
  1132. for (let i = 0; i < this.activeSoundList.length; i++) {
  1133. for (let j = 0; j < this.multipleSelection.length; j++) {
  1134. if (this.activeSoundList[i].id == this.multipleSelection[j].id) {
  1135. this.activeSoundList.splice(i, 1);
  1136. // 遍历循环所有的group 删除所选id
  1137. for (let key in this.soundLists) {
  1138. if (
  1139. this.soundLists[key].indexOf(
  1140. this.multipleSelection[j].id
  1141. ) != -1
  1142. ) {
  1143. this.soundLists[key].splice(
  1144. this.soundLists[key].indexOf(
  1145. this.multipleSelection[j].id
  1146. ),
  1147. 1
  1148. );
  1149. }
  1150. }
  1151. }
  1152. }
  1153. }
  1154. this.$forceUpdate()
  1155. })
  1156. })
  1157. .catch(() => { });
  1158. },
  1159. // 勾选选中框处理数据,存储勾选过的checkbox值
  1160. checkinlist (obj) {
  1161. // console.log(this.activeSoundList)
  1162. let flag = false;
  1163. this.activeSoundList.map(item => {
  1164. if (item.id == obj.id) {
  1165. flag = true;
  1166. }
  1167. });
  1168. if (!flag) {
  1169. this.activeSoundList.push(obj);
  1170. } else {
  1171. for (let i = 0; i < this.activeSoundList.length; i++) {
  1172. if (this.activeSoundList[i].id == obj.id) {
  1173. this.activeSoundList.splice(i, 1);
  1174. }
  1175. }
  1176. }
  1177. },
  1178. // 根据声部id获取可选乐器种类
  1179. chioseType (row) {
  1180. // 根据id查询可选类型种类
  1181. let id = row.id;
  1182. // 'subjectId': id, ' type'='INSTRUMENT'
  1183. getSubjectGoods({ subjectId: id, type: "INSTRUMENT", chargeTypeId: this.topfor.type }).then(res => {
  1184. if (res.code == 200) {
  1185. row.goodsList = res.data;
  1186. }
  1187. });
  1188. },
  1189. // 点击关闭乐器种类
  1190. closechioseType (row) {
  1191. row.typeVisible = false;
  1192. },
  1193. // 更改乐器可选规格重置提供方式
  1194. changezhonglei (row) {
  1195. row.fangshi = [];
  1196. },
  1197. // 根据声部id查询可选教辅
  1198. chioseMark (row) {
  1199. row.markVisible = true;
  1200. let id = row.id;
  1201. getGoods({ subjectId: id, type: "ACCESSORIES" }).then(res => {
  1202. if (res.code == 200) {
  1203. row.markChioseList = res.data;
  1204. }
  1205. });
  1206. },
  1207. // 添加教辅
  1208. addMark (row) {
  1209. row.markList.push({ name: "", goods: [], price: "", marketPrice: 0 });
  1210. },
  1211. // 删除教辅
  1212. removeMartItem (row, index) {
  1213. row.markList.splice(index, 1);
  1214. },
  1215. // 点击保存或编辑
  1216. savecolumn (row) {
  1217. row.type == 1 ? (row.type = 2) : (row.type = 1);
  1218. },
  1219. // 返回上一步
  1220. goback () {
  1221. this.$emit("chiosetab", 0);
  1222. },
  1223. submitInfo (type) {
  1224. let isJihua = true;
  1225. let isMusic = true;
  1226. this.activeSoundList.forEach(item => {
  1227. if (!item.jihua) {
  1228. isJihua = false;
  1229. }
  1230. if (!item.yuji) {
  1231. if (item.yuji === 0) {
  1232. } else {
  1233. isMusic = false;
  1234. }
  1235. }
  1236. })
  1237. if (!isJihua) {
  1238. this.$message.error('请填写预计招生人数')
  1239. return
  1240. }
  1241. if (!isMusic) {
  1242. this.$message.error('请填写乐团课程费用')
  1243. return
  1244. }
  1245. this.isNullFangshi = true;
  1246. // return;
  1247. let status;
  1248. let titleStr = "";
  1249. if (type == 1) {
  1250. // 保存
  1251. status = "DRAFT";
  1252. titleStr = "确定保存?";
  1253. } else if (type == 2) {
  1254. // 提交
  1255. status = "AUDIT";
  1256. titleStr = "确定提交";
  1257. }
  1258. // 整理数据提交
  1259. if (this.teamStatus == "newTeam") {
  1260. let obj = {};
  1261. // 解析数据
  1262. let courseJson = {};
  1263. for (let i in this.checkfor) {
  1264. if (this.checkfor[i].ischeck) {
  1265. courseJson[i] = this.checkfor[i]
  1266. }
  1267. }
  1268. for (let j in this.newStudentfor) {
  1269. if (this.newStudentfor[j].ischeck) {
  1270. courseJson[j] = this.newStudentfor[j]
  1271. }
  1272. }
  1273. obj.months = this.payfor.chioseMonth || [];
  1274. let enrollClasses;
  1275. this.topfor.startClass
  1276. ? (enrollClasses = this.topfor.startClass.join(","))
  1277. : (enrollClasses = null);
  1278. obj.musicGroup = {
  1279. settlementType: this.topfor.salary,
  1280. applyExpireDate: this.topfor.time + " 00:00:01",
  1281. chargeTypeId: this.topfor.type,
  1282. cooperationOrganId: this.topfor.school,
  1283. teamTeacherId: this.topfor.boss,
  1284. educationalTeacherId: this.topfor.teacher,
  1285. enrollClasses,
  1286. name: this.topfor.name,
  1287. organId: this.topfor.section,
  1288. paymentPattern: this.topfor.paymentPattern,
  1289. paymentValidStartDate: this.topfor.paymentValidStartDate ? dayjs(this.topfor.paymentValidStartDate).format('YYYY-MM-DD') : this.topfor.paymentValidStartDate,
  1290. paymentValidEndDate: this.topfor.paymentValidEndDate ? dayjs(this.topfor.paymentValidEndDate).format('YYYY-MM-DD') : this.topfor.paymentValidEndDate,
  1291. // paymentMonths:obj.months 有待确认
  1292. schoolId: this.topfor.address,
  1293. courseForm: JSON.stringify(courseJson),
  1294. expectStartGroupDate: this.topfor.startTime,
  1295. isClassroomLessons: this.topfor.isClass,
  1296. status,
  1297. ownershipType: this.topfor.ownershipType,
  1298. repairUserId: this.topfor.repairUserId,
  1299. feeType: this.topfor.feeType
  1300. };
  1301. obj.musicGroupPaymentEntities = [];
  1302. // 添加学校主体付费方式
  1303. if (this.payfor.student.ischeck) {
  1304. obj.musicGroupPaymentEntities.push({
  1305. paymentMethod: this.payfor.student.chiose,
  1306. name: "学生"
  1307. });
  1308. }
  1309. if (this.payfor.school.ischeck) {
  1310. obj.musicGroupPaymentEntities.push({
  1311. amount: this.payfor.school.price,
  1312. memo: this.payfor.school.value,
  1313. paymentMethod: this.payfor.school.chiose,
  1314. name: "学校"
  1315. });
  1316. }
  1317. // 添加公司主体付费方式
  1318. if (this.payfor.company.ischeck) {
  1319. obj.musicGroupPaymentEntities.push({
  1320. amount: this.payfor.company.price,
  1321. memo: this.payfor.company.value,
  1322. paymentMethod: this.payfor.company.chiose,
  1323. name: "公司"
  1324. });
  1325. }
  1326. let activeSoundList = this.activeSoundList;
  1327. // 添加商品以及教辅
  1328. obj.musicGroupSubjectGoodsGroups = [];
  1329. obj.musicGroupSubjectPlans = [];
  1330. activeSoundList.forEach(active => {
  1331. // 乐器
  1332. active.zhonglei.forEach(zl => {
  1333. let goodsItem = [];
  1334. active.goodsList.forEach(goods => {
  1335. if (goods.id == zl) {
  1336. goodsItem = goods;
  1337. }
  1338. });
  1339. let kitGroupPurchaseTypeJson = null;
  1340. let depositFee, price;
  1341. let coursePurchaseTypeJson = null;
  1342. active.fangshi.forEach(fs => {
  1343. if (fs.id == -1) {
  1344. return
  1345. }
  1346. if (fs.id == zl) {
  1347. depositFee = fs.mode.depositFee;
  1348. price = fs.mode.price;
  1349. let types = {};
  1350. if (fs.mode.isFREE) {
  1351. types.FREE = fs.mode.FREE ? fs.mode.FREE : 0;
  1352. }
  1353. if (fs.mode.isGROUP) {
  1354. types.GROUP = fs.mode.GROUP ? fs.mode.GROUP : 0;
  1355. }
  1356. if (fs.mode.isLEASE) {
  1357. types.LEASE = fs.mode.LEASE ? fs.mode.LEASE : 0;
  1358. }
  1359. kitGroupPurchaseTypeJson = JSON.stringify(types);
  1360. if (kitGroupPurchaseTypeJson.length <= 0) {
  1361. kitGroupPurchaseTypeJson = null;
  1362. }
  1363. let courseTypes = {}
  1364. if (fs.mode.courseFree) {
  1365. courseTypes.FREE = fs.mode.courseFree ? fs.mode.courseFree : 0
  1366. }
  1367. if (fs.mode.courseGroup) {
  1368. courseTypes.GROUP = fs.mode.courseGroup ? fs.mode.courseGroup : 0
  1369. }
  1370. if (fs.mode.courseLease) {
  1371. courseTypes.LEASE = fs.mode.courseLease ? fs.mode.courseLease : 0
  1372. }
  1373. coursePurchaseTypeJson = JSON.stringify(courseTypes)
  1374. if (coursePurchaseTypeJson.length <= 0) {
  1375. coursePurchaseTypeJson = null;
  1376. }
  1377. }
  1378. });
  1379. let some = {
  1380. subjectId: active.id,
  1381. type: "INSTRUMENT",
  1382. goodsIdList: zl,
  1383. name: goodsItem.name,
  1384. price,
  1385. kitGroupPurchaseTypeJson,
  1386. coursePurchaseTypeJson,
  1387. depositFee
  1388. };
  1389. obj.musicGroupSubjectGoodsGroups.push(some);
  1390. });
  1391. // 附件
  1392. active.markList.forEach(mark => {
  1393. if (mark.goods.length >= 1) {
  1394. let some = {
  1395. subjectId: active.id,
  1396. type: "ACCESSORIES",
  1397. goodsIdList: mark.goods.join(","),
  1398. name: mark.name,
  1399. price: mark.price,
  1400. marketPrice: mark.marketPrice
  1401. };
  1402. obj.musicGroupSubjectGoodsGroups.push(some);
  1403. }
  1404. });
  1405. let depositFee;
  1406. if (!active.fangshi) {
  1407. this.isNullFangshi = false;
  1408. }
  1409. if (active.fangshi == "LEASE") {
  1410. depositFee = active.fangshiprice;
  1411. } else {
  1412. depositFee = 0;
  1413. }
  1414. // 添加声部
  1415. let item = {
  1416. expectedStudentNum: active.jihua,
  1417. fee: active.yuji,
  1418. // kitGroupPurchaseType: active.fangshi,
  1419. subName: active.sound,
  1420. subjectId: active.id
  1421. // depositFee// depositFee 只有租赁才有
  1422. };
  1423. obj.musicGroupSubjectPlans.push(item);
  1424. });
  1425. this.$confirm(titleStr, "提示", {
  1426. confirmButtonText: "确定",
  1427. cancelButtonText: "取消",
  1428. type: "warning"
  1429. })
  1430. .then(() => {
  1431. createTeam(obj).then(res => {
  1432. if (res.code == 200) {
  1433. // 成功 跳转到乐团报名详情
  1434. this.$router.push({
  1435. path: "/business/teamDetail",
  1436. query: { search: this.Fsearch, rules: this.Frules }
  1437. });
  1438. }
  1439. });
  1440. })
  1441. .catch(() => { });
  1442. } else {
  1443. // 只提交第二页的数据
  1444. let obj = {};
  1445. let activeSoundList = this.activeSoundList;
  1446. // 添加商品以及教辅
  1447. obj.musicGroupId = this.teamid;
  1448. obj.musicGroupStatus = status;
  1449. obj.musicGroupSubjectGoodsGroups = [];
  1450. obj.musicGroupSubjectPlans = [];
  1451. activeSoundList.forEach(active => {
  1452. // 乐器
  1453. active.zhonglei.forEach(zl => {
  1454. let goodsItem = [];
  1455. active.goodsList.forEach(goods => {
  1456. if (goods.id == zl) {
  1457. goodsItem = goods;
  1458. }
  1459. });
  1460. let kitGroupPurchaseTypeJson = null;
  1461. let depositFee, price;
  1462. let coursePurchaseTypeJson = null;
  1463. active.fangshi.forEach(fs => {
  1464. if (fs.id == zl) {
  1465. depositFee = fs.mode.depositFee;
  1466. price = fs.mode.price;
  1467. let types = {};
  1468. if (fs.mode.isFREE) {
  1469. types.FREE = fs.mode.FREE ? fs.mode.FREE : 0;
  1470. }
  1471. if (fs.mode.isGROUP) {
  1472. types.GROUP = fs.mode.GROUP ? fs.mode.GROUP : 0;
  1473. }
  1474. if (fs.mode.isLEASE) {
  1475. types.LEASE = fs.mode.LEASE ? fs.mode.LEASE : 0;
  1476. }
  1477. kitGroupPurchaseTypeJson = JSON.stringify(types);
  1478. if (kitGroupPurchaseTypeJson.length <= 0) {
  1479. kitGroupPurchaseTypeJson = null;
  1480. }
  1481. let courseTypes = {}
  1482. if (fs.mode.courseFree) {
  1483. courseTypes.FREE = fs.mode.courseFree ? fs.mode.courseFree : 0
  1484. }
  1485. if (fs.mode.courseGroup) {
  1486. courseTypes.GROUP = fs.mode.courseGroup ? fs.mode.courseGroup : 0
  1487. }
  1488. if (fs.mode.courseLease) {
  1489. courseTypes.LEASE = fs.mode.courseLease ? fs.mode.courseLease : 0
  1490. }
  1491. coursePurchaseTypeJson = JSON.stringify(courseTypes)
  1492. if (coursePurchaseTypeJson.length <= 0) {
  1493. coursePurchaseTypeJson = null;
  1494. }
  1495. }
  1496. });
  1497. let some = {
  1498. subjectId: active.id,
  1499. type: "INSTRUMENT",
  1500. goodsIdList: zl,
  1501. name: goodsItem.name,
  1502. kitGroupPurchaseTypeJson,
  1503. coursePurchaseTypeJson,
  1504. depositFee,
  1505. price
  1506. };
  1507. obj.musicGroupSubjectGoodsGroups.push(some);
  1508. });
  1509. // 遍历声部里的教辅
  1510. active.markList.forEach(mark => {
  1511. if (mark.goods.length >= 1) {
  1512. let some = {
  1513. subjectId: active.id,
  1514. type: "ACCESSORIES",
  1515. goodsIdList: mark.goods.join(","),
  1516. name: mark.name,
  1517. price: mark.price,
  1518. marketPrice: mark.marketPrice
  1519. };
  1520. obj.musicGroupSubjectGoodsGroups.push(some);
  1521. }
  1522. });
  1523. // 添加声部
  1524. let depositFee;
  1525. // 如果没有提供方式则报错
  1526. if (!active.fangshi) {
  1527. this.isNullFangshi = false;
  1528. }
  1529. if (active.fangshi == "LEASE") {
  1530. depositFee = active.fangshiprice;
  1531. } else {
  1532. depositFee = 0;
  1533. }
  1534. let item = {
  1535. expectedStudentNum: active.jihua,
  1536. fee: active.yuji,
  1537. // kitGroupPurchaseType: active.fangshi,
  1538. subName: active.sound,
  1539. subjectId: active.id
  1540. // depositFee: depositFee // depositFee 只有租赁才有
  1541. };
  1542. obj.musicGroupSubjectPlans.push(item);
  1543. });
  1544. if (!this.isNullFangshi) {
  1545. this.$message.error("请填写乐器提供方式");
  1546. return;
  1547. }
  1548. this.$confirm(`确定提交?`, "提示", {
  1549. confirmButtonText: "确定",
  1550. cancelButtonText: "取消",
  1551. type: "warning"
  1552. })
  1553. .then(() => {
  1554. // 发请求修改声部信息
  1555. updateSubjectInfo(obj).then(res => {
  1556. if (res.code == 200) {
  1557. this.$message.success("提交成功");
  1558. this.$router.push({
  1559. path: "/business/teamDetail",
  1560. query: { search: this.Fsearch, rules: this.Frules }
  1561. });
  1562. }
  1563. });
  1564. })
  1565. .catch(() => { });
  1566. }
  1567. },
  1568. // 同意
  1569. approval () {
  1570. this.$confirm(`是否审核通过?`, "提示", {
  1571. confirmButtonText: "确定",
  1572. cancelButtonText: "取消",
  1573. type: "warning"
  1574. })
  1575. .then(() => {
  1576. auditSuccess({ musicGroupId: this.teamid }).then(res => {
  1577. if (res.code == 200) {
  1578. this.$message.success("审核通过");
  1579. this.$router.push({
  1580. path: "/business/teamDetail",
  1581. query: { search: this.Fsearch, rules: this.Frules }
  1582. });
  1583. }
  1584. });
  1585. })
  1586. .catch(() => { });
  1587. },
  1588. // 拒绝
  1589. refuse () {
  1590. // auditFailed
  1591. this.$prompt("请输入拒绝原因", "提示", {
  1592. confirmButtonText: "确定",
  1593. cancelButtonText: "取消"
  1594. }).then(({ value }) => {
  1595. // 点击确认 值是value
  1596. if (!value) {
  1597. this.$message.error("请输入拒绝原因");
  1598. return;
  1599. } else {
  1600. auditFailed({ musicGroupId: this.teamid, memo: value }).then(res => {
  1601. if (res.code == 200) {
  1602. this.$message.success("已拒绝");
  1603. this.$router.push({
  1604. path: "/business/teamDetail",
  1605. query: { search: this.Fsearch, rules: this.Frules }
  1606. });
  1607. }
  1608. });
  1609. }
  1610. });
  1611. },
  1612. // 设置乐器提供方式
  1613. setGiveMode (row) {
  1614. // goodsList
  1615. if (row.zhonglei.length <= 0) {
  1616. this.$message.error("请先选择乐器规格");
  1617. return;
  1618. }
  1619. // row.fangshi = []
  1620. // row.zhonglei
  1621. // row.goodsList
  1622. const tyuji = row.yuji
  1623. if (row.fangshi[0] && row.fangshi[0].mode) {
  1624. row.fangshi.forEach(item => {
  1625. item.mode.yuji = tyuji
  1626. })
  1627. } else {
  1628. for (let i in row.goodsList) {
  1629. for (let j in row.zhonglei) {
  1630. if (row.goodsList[i].id == row.zhonglei[j]) {
  1631. row.fangshi.push({
  1632. shopName: row.goodsList[i].name,
  1633. id: row.goodsList[i].id,
  1634. mode: {
  1635. yuji: tyuji,
  1636. FREE: 0,
  1637. GROUP: row.goodsList[i].musicGroupDiscountPrice,
  1638. LEASE: 0,
  1639. courseFree: 0,
  1640. courseLease: null,
  1641. courseGroup: 0,
  1642. depositFee: 1500, // 保证金
  1643. price: row.goodsList[i].groupPurchasePrice, // 团购价
  1644. marketPrice: row.goodsList[i].marketPrice, // 原价
  1645. isFREE: false,
  1646. isGROUP: false,
  1647. isLEASE: false
  1648. }
  1649. });
  1650. }
  1651. }
  1652. }
  1653. }
  1654. let flag = true;
  1655. row.fangshi.forEach(item => {
  1656. if (item.id == -1) {
  1657. flag = false;
  1658. }
  1659. })
  1660. if (flag) {
  1661. row.fangshi.push({
  1662. checked: false,
  1663. id: -1,
  1664. mode: {
  1665. isFREE: false,
  1666. isGROUP: false,
  1667. isLEASE: false,
  1668. isNull: true,
  1669. yuji: 0,
  1670. FREE: 0,
  1671. GROUP: 0,
  1672. LEASE: 0,
  1673. courseGroup: 0,
  1674. courseLease: 0,
  1675. depositFee: 0,
  1676. marketPrice: 0,
  1677. price: 0
  1678. },
  1679. shopName: "自备"
  1680. })
  1681. }
  1682. this.editSound = row;
  1683. this.reductionVisible = true;
  1684. },
  1685. resetSoundItem () {
  1686. for (let i in this.activeSoundList) {
  1687. if (this.activeSoundList[i].id == this.editSound.id) {
  1688. this.activeSoundList[i].id = this.editSound.id;
  1689. this.reductionVisible = false;
  1690. }
  1691. }
  1692. },
  1693. groupInput (item) {
  1694. if (item.mode.price - item.mode.GROUP < 0) {
  1695. item.mode.GROUP = item.mode.price;
  1696. }
  1697. },
  1698. groupCourseInput (item) {
  1699. let mode = item.mode
  1700. if (mode.yuji - mode.courseGroup < 0) {
  1701. mode.courseGroup = mode.yuji
  1702. }
  1703. },
  1704. deposiInput (item) {
  1705. if (item.mode.depositFee - item.mode.LEASE < 0) {
  1706. item.mode.LEASE = item.mode.depositFee;
  1707. }
  1708. },
  1709. setDeposiInput (val, item) {
  1710. item.mode.LEASE = 0;
  1711. },
  1712. // 查看预览
  1713. lookPreview (row) {
  1714. this.lookPreviewRow = row;
  1715. // 判断商品里的最高价 选中
  1716. if (!this.lookPreviewRow.yuji.toString()) {
  1717. this.$message.error('请输入乐团课程费用')
  1718. return
  1719. }
  1720. this.previewVisible = true;
  1721. this.setChioseMusic(this.lookPreviewRow)
  1722. this.calcPrice()
  1723. },
  1724. setChioseMusic (row) {
  1725. // 多个乐器得比较乐器费用
  1726. if (row.fangshi.length <= 0) {
  1727. return
  1728. }
  1729. let flag = true;
  1730. row.fangshi.sort((a, b) => {
  1731. return b.mode.price - a.mode.price
  1732. })
  1733. let groupList = []
  1734. let leaseList = []
  1735. row.fangshi.forEach(item => {
  1736. if (item.id == -1) {
  1737. flag = false;
  1738. }
  1739. if (item.mode.isGROUP) {
  1740. groupList.push(item)
  1741. }
  1742. if (item.mode.isLEASE) {
  1743. leaseList.push(item)
  1744. }
  1745. })
  1746. let item = null
  1747. if (groupList.length > 0) {
  1748. // 勾选团购
  1749. groupList[0].chiosetype = 'GROUP'
  1750. groupList[0].checked = true
  1751. item = groupList[0]
  1752. } else if (leaseList.length > 0) {
  1753. leaseList[0].chiosetype = 'isLEASE'
  1754. leaseList[0].checked = true
  1755. item = leaseList[0]
  1756. } else {
  1757. row.fangshi[0].checked = true;
  1758. row.fangshi[0].chiosetype = 'isFREE'
  1759. item = row.fangshi[0]
  1760. }
  1761. row.fangshi.forEach((some, index) => {
  1762. if (item.id == some.id) {
  1763. row.fangshi[index] = item;
  1764. }
  1765. })
  1766. row.markList.forEach(item => {
  1767. item.checked = true
  1768. })
  1769. if (flag) {
  1770. row.fangshi.push({
  1771. checked: false,
  1772. id: -1,
  1773. mode: {
  1774. isFREE: false,
  1775. isGROUP: false,
  1776. isLEASE: false,
  1777. isNull: true,
  1778. yuji: 0,
  1779. FREE: 0,
  1780. GROUP: 0,
  1781. LEASE: 0,
  1782. courseGroup: 0,
  1783. courseLease: 0,
  1784. depositFee: 0,
  1785. marketPrice: 0,
  1786. price: 0
  1787. },
  1788. shopName: "自备"
  1789. })
  1790. }
  1791. },
  1792. onAuxiliarie (item) {
  1793. // 辅件切换状态
  1794. item.checked = !item.checked;
  1795. // 重新计算金额
  1796. this.calcPrice();
  1797. },
  1798. instrumentF (item) {
  1799. // 乐器切换状态
  1800. this.lookPreviewRow.fangshi.forEach(item => {
  1801. item.checked = false;
  1802. });
  1803. item.checked = true;
  1804. // 重新计算金额
  1805. this.calcPrice();
  1806. },
  1807. onPreviewClose () {
  1808. this.lookPreviewRow.fangshi.forEach(item => {
  1809. item.checked = false;
  1810. });
  1811. this.lookPreviewRow.markList.forEach(item => {
  1812. item.checked = false;
  1813. })
  1814. },
  1815. calcPrice () {
  1816. let amount = 0
  1817. let marketPrice = 0
  1818. let goodsGroupIds = {}
  1819. let couponPrice = 0// 优惠金额
  1820. let goodsIds = []
  1821. let contractGoodsIds = ""; // 合同所需要的商品Id (只需要乐器编号)
  1822. // 课程 this.topfor payfor checkfor
  1823. let mgs = Number(this.lookPreviewRow.yuji);
  1824. let coursePrice = Number(mgs)
  1825. let csi = this.checkfor;
  1826. let newStudent = this.newStudentfor
  1827. // 加上判断是否有课程信息
  1828. const sbaseInfo = newStudent.baseInfo
  1829. if (sbaseInfo.ischeck && sbaseInfo.isStatus) {
  1830. const value = Number(parseFloat(sbaseInfo.nowValue ? sbaseInfo.nowValue : 0))
  1831. marketPrice += value;
  1832. amount += Number(parseFloat(sbaseInfo.value ? sbaseInfo.value : 0))
  1833. }
  1834. if (mgs) {
  1835. // console.log(csi)
  1836. // amount += parseFloat(mgs);
  1837. const allInfo = csi.allInfo
  1838. if (allInfo.ischeck) {
  1839. const value = Number(parseFloat(allInfo.value ? allInfo.value : 0))
  1840. if (allInfo.isStatus) {
  1841. marketPrice += value;
  1842. }
  1843. if (allInfo.isStatus && allInfo.checkBuy) {
  1844. coursePrice += parseFloat(allInfo.checkBuy ? value : 0)
  1845. }
  1846. }
  1847. const baseInfo = csi.baseInfo
  1848. if (baseInfo.ischeck) {
  1849. const value = parseFloat(baseInfo.value ? baseInfo.value : 0)
  1850. if (baseInfo.isStatus) {
  1851. marketPrice += value;
  1852. }
  1853. if (baseInfo.isStatus && baseInfo.checkBuy) {
  1854. coursePrice += parseFloat(baseInfo.checkBuy ? value : 0)
  1855. }
  1856. }
  1857. const holidayInfo = csi.holidayInfo
  1858. if (holidayInfo.ischeck) {
  1859. const value = parseFloat(holidayInfo.value ? holidayInfo.value : 0)
  1860. if (holidayInfo.isStatus) {
  1861. marketPrice += value
  1862. }
  1863. if (holidayInfo.isStatus && holidayInfo.checkBuy) {
  1864. coursePrice += parseFloat(holidayInfo.checkBuy ? value : 0)
  1865. }
  1866. }
  1867. const soundInfo = csi.soundInfo
  1868. if (soundInfo.ischeck) {
  1869. const value = parseFloat(soundInfo.value ? soundInfo.value : 0)
  1870. if (soundInfo.isStatus) {
  1871. marketPrice += value;
  1872. }
  1873. if (soundInfo.isStatus && soundInfo.checkBuy) {
  1874. coursePrice += parseFloat(soundInfo.checkBuy ? value : 0)
  1875. }
  1876. }
  1877. const networkInfo = csi.networkInfo
  1878. if (networkInfo.ischeck) {
  1879. const value = parseFloat(networkInfo.value ? networkInfo.value : 0)
  1880. if (networkInfo.isStatus) {
  1881. marketPrice += value;
  1882. }
  1883. if (networkInfo.isStatus && networkInfo.checkBuy) {
  1884. coursePrice += parseFloat(networkInfo.checkBuy ? value : 0)
  1885. }
  1886. }
  1887. }
  1888. let ir = this.lookPreviewRow.fangshi;
  1889. let courseCouponPrice = 0
  1890. if (ir.length > 0) {
  1891. ir.forEach(item => {
  1892. if (item.checked) {
  1893. // if (item.name != "自备") {
  1894. // contractGoodsIds += item.goodsIdList;
  1895. // }
  1896. if (item.chiosetype == "FREE") {
  1897. // 免费
  1898. amount += 0;
  1899. couponPrice = 0; // 优惠金额
  1900. courseCouponPrice = 0
  1901. marketPrice += parseFloat(item.mode.marketPrice)
  1902. } else if (item.chiosetype == "LEASE") {
  1903. // 租赁
  1904. // couponPrice = parseFloat(item.mode.LEASE); // 优惠金额
  1905. // courseCouponPrice = parseFloat(item.mode.courseLease || 0)
  1906. // console.log(parseFloat(item.mode.depositFee), 'lease')
  1907. amount += parseFloat(item.mode.depositFee);
  1908. marketPrice += parseFloat(item.mode.depositFee);
  1909. } else {
  1910. //团购
  1911. amount += parseFloat(item.mode.price);
  1912. couponPrice = parseFloat(item.mode.GROUP);
  1913. courseCouponPrice = parseFloat(item.mode.courseGroup)
  1914. marketPrice += parseFloat(item.mode.marketPrice)
  1915. }
  1916. }
  1917. });
  1918. }
  1919. if (coursePrice - Number(courseCouponPrice) >= 0) {
  1920. coursePrice = Number((coursePrice - courseCouponPrice).toFixed(2))
  1921. } else {
  1922. coursePrice = 0
  1923. }
  1924. let check = [];
  1925. for (let i in this.checkfor) {
  1926. if (this.checkfor[i] && i != 'submit') {
  1927. check.push(this.checkfor[i].ischeck)
  1928. }
  1929. }
  1930. let checkFlag = false
  1931. check.forEach(item => {
  1932. checkFlag = checkFlag || item
  1933. })
  1934. if (!checkFlag) {
  1935. marketPrice += Number(parseFloat(coursePrice))
  1936. //
  1937. }
  1938. amount += parseFloat(coursePrice);
  1939. // console.log(this.lookPreviewRow.markList)
  1940. // 辅件
  1941. if (this.lookPreviewRow.markList.length > 0) {
  1942. this.lookPreviewRow.markList.forEach(item => {
  1943. if (item.checked) {
  1944. amount += parseFloat(item.price);
  1945. let tempPrice = 0
  1946. item.goods.forEach(item => {
  1947. tempPrice += this.getAccessoryPrice(item)
  1948. })
  1949. marketPrice += parseFloat(tempPrice);
  1950. // if (item.goodsList && item.goodsList.length > 0) {
  1951. // item.goodsList.forEach(childGoods => {
  1952. // marketPrice += parseFloat(childGoods.marketPrice);
  1953. // });
  1954. // }
  1955. // goodsGroupIds.push(item.id)
  1956. // goodsGroupIds[item.id] = "ACCESSORIES";
  1957. // contractGoodsIds += ',' + item.goodsIdList
  1958. }
  1959. });
  1960. }
  1961. // 其它
  1962. // if (this.otherResult.length > 0) {
  1963. // this.otherResult.forEach(item => {
  1964. // amount += parseFloat(item.price);
  1965. // marketPrice += parseFloat(item.marketPrice);
  1966. // // goodsGroupIds.push(item.id)
  1967. // goodsGroupIds[item.id] = "OTHER";
  1968. // // contractGoodsIds += ',' + item.id
  1969. // });
  1970. // } else if (this.otherGoods) {
  1971. // this.otherGoods.forEach(item => {
  1972. // amount += parseFloat(item.groupPurchasePrice);
  1973. // marketPrice += parseFloat(item.marketPrice);
  1974. // goodsIds.push(item.id);
  1975. // // contractGoodsIds += ',' + item.id
  1976. // });
  1977. // }
  1978. let tempGroupPurchasePrice = amount || 0
  1979. // 判断减去优惠金额,是否大于0(这里有可能出现负数)
  1980. if (amount - couponPrice >= 0) {
  1981. amount = Number((amount - couponPrice).toFixed(2));
  1982. this.errorPrice = false;
  1983. } else {
  1984. amount = 0;
  1985. this.errorPrice = true; // 订单金额是否异常
  1986. }
  1987. // 计算是否使用过余额
  1988. if (this.payType) {
  1989. let tempPrice = Number((amount - this.balance).toFixed(2));
  1990. if (tempPrice > 0) {
  1991. this.needPrice = tempPrice;
  1992. } else {
  1993. this.needPrice = 0;
  1994. }
  1995. } else {
  1996. this.needPrice = Number(amount.toFixed(2));
  1997. }
  1998. this.orderInfo = {
  1999. amount: Number(amount.toFixed(2)),
  2000. marketPrice: Number(marketPrice.toFixed(2)),
  2001. groupPurchasePrice: Number(tempGroupPurchasePrice.toFixed(2)),
  2002. couponPrice: couponPrice,
  2003. goodsGroupIds: goodsGroupIds,
  2004. goodsIds: goodsIds.join(","),
  2005. contractGoodsIds: contractGoodsIds,
  2006. coursePrice: coursePrice
  2007. };
  2008. },
  2009. getAccessoryPrice (val) {
  2010. const lookPreviewRow = this.lookPreviewRow
  2011. if (lookPreviewRow && lookPreviewRow.markChioseList) {
  2012. for (let i in lookPreviewRow.markChioseList) {
  2013. if (lookPreviewRow.markChioseList[i].id == val) {
  2014. return lookPreviewRow.markChioseList[i].marketPrice;
  2015. }
  2016. }
  2017. }
  2018. return 0;
  2019. },
  2020. },
  2021. filters: {
  2022. AccessoryName (val, lookPreviewRow) {
  2023. if (lookPreviewRow && lookPreviewRow.markChioseList) {
  2024. for (let i in lookPreviewRow.markChioseList) {
  2025. if (lookPreviewRow.markChioseList[i].id == val) {
  2026. return lookPreviewRow.markChioseList[i].name;
  2027. }
  2028. }
  2029. }
  2030. return "";
  2031. },
  2032. AccessoryPrice (val, lookPreviewRow) {
  2033. if (lookPreviewRow && lookPreviewRow.markChioseList) {
  2034. for (let i in lookPreviewRow.markChioseList) {
  2035. if (lookPreviewRow.markChioseList[i].id == val) {
  2036. return lookPreviewRow.markChioseList[i].marketPrice;
  2037. }
  2038. }
  2039. }
  2040. return "";
  2041. },
  2042. zhongleiFilter (val, list) {
  2043. if (list.length <= 0) {
  2044. return;
  2045. }
  2046. let arr = [];
  2047. for (let i = 0; i < list.length; i++) {
  2048. for (let j = 0; j < val.length; j++) {
  2049. if (val[j] == list[i].id) {
  2050. arr.push(list[i].name);
  2051. }
  2052. }
  2053. }
  2054. if (arr.length > 0) {
  2055. return arr.join(",");
  2056. } else {
  2057. return "";
  2058. }
  2059. },
  2060. fangshiFilter (val, price) {
  2061. let str = "";
  2062. for (let i in val) {
  2063. let vals = val[i]
  2064. str += `${vals.shopName}:`;
  2065. if (vals.mode.isFREE) {
  2066. str += `免费:减免金额${vals.mode["FREE"]},课程减免${vals.mode['courseFree'] ? vals.mode['courseFree'] : 0}\n`;
  2067. }
  2068. if (vals.mode.isGROUP) {
  2069. str += `团购:团购价${vals.mode["price"]},减免金额${vals.mode["GROUP"] ? vals.mode["GROUP"] : 0},课程减免${vals.mode['courseGroup'] ? vals.mode['courseGroup'] : 0}\n`;
  2070. }
  2071. if (vals.mode.isLEASE) {
  2072. str += `租赁:${vals.mode.depositFee},减免金额${vals.mode["LEASE"] ? vals.mode["LEASE"] : 0},课程减免${vals.mode['courseLease'] ? vals.mode['courseLease'] : 0}\n`;
  2073. }
  2074. }
  2075. // if (val == 'FREE') {
  2076. // str = '免费'
  2077. // return str;
  2078. // } else if (val == 'GROUP') {
  2079. // str = '团购'
  2080. // return str
  2081. // } else if (val == 'LEASE') {
  2082. // str = '借用'
  2083. // }
  2084. // str = str.substring(0, str.length - 1)
  2085. return str;
  2086. },
  2087. goodsFilter (val, list) {
  2088. if (list.length <= 0) {
  2089. return "";
  2090. }
  2091. let arr = [];
  2092. for (let i = 0; i < val.length; i++) {
  2093. for (let j = 0; j < list.length; j++) {
  2094. if (val[i] == list[j].id) {
  2095. arr.push(list[j].name);
  2096. }
  2097. }
  2098. }
  2099. if (arr.length > 0) {
  2100. return arr.join(",");
  2101. } else {
  2102. return "";
  2103. }
  2104. }
  2105. // markFilter(val){
  2106. // for
  2107. // let name = val.name;
  2108. // let goods = val.goods.join(',');
  2109. // let price = val.price
  2110. // }
  2111. },
  2112. watch: {
  2113. previewVisible (val) {
  2114. if (!val) {
  2115. this.orderInfo = {
  2116. marketPrice: 0,
  2117. groupPurchasePrice: 0,
  2118. amount: 0, // 现价总金额
  2119. goodsGroupIds: null,
  2120. goodsIds: null,
  2121. contractGoodsIds: null, // 选中所有商品ID
  2122. couponPrice: 0 //
  2123. };
  2124. this.needPrice = 0;
  2125. }
  2126. }
  2127. },
  2128. computed: {
  2129. // 返回当前选中声部数量
  2130. chioseSoundNum () {
  2131. let num = 0;
  2132. for (let key in this.soundList) {
  2133. num += this.soundLists[key].length;
  2134. }
  2135. return num;
  2136. },
  2137. // 计划招生人数
  2138. PlannedCount () {
  2139. let Count = 0;
  2140. for (let item in this.activeSoundList) {
  2141. Count += parseInt(this.activeSoundList[item].jihua) || 0;
  2142. }
  2143. return Count;
  2144. }
  2145. }
  2146. };
  2147. </script>
  2148. <style lang="scss" scoped>
  2149. // .el-table__body tr.current-row > td {
  2150. // background-color: #c6cbd4 !important;
  2151. // }
  2152. .nowPrice {
  2153. color: #1a1a1a;
  2154. font-size: 16px;
  2155. }
  2156. .nowMoney {
  2157. height: 50px;
  2158. // border-top: 1px solid #eaeaea;
  2159. border-bottom: 1px solid #eaeaea;
  2160. line-height: 50px;
  2161. text-align: right;
  2162. color: #ff0000;
  2163. font-size: 20px;
  2164. font-weight: bold;
  2165. .title {
  2166. font-size: 16px;
  2167. }
  2168. .dot {
  2169. font-size: 16px;
  2170. }
  2171. }
  2172. .el-checkbox__input.is-checked .el-checkbox__inner,
  2173. .el-checkbox__input.is-indeterminate .el-checkbox__inner {
  2174. background-color: #14928a;
  2175. border-color: #14928a;
  2176. }
  2177. .el-select__tags .el-tag__close.el-icon-close {
  2178. display: inline-block;
  2179. }
  2180. // .el-dialog__header {
  2181. // padding: 0 32px !important;
  2182. // height: 40px;
  2183. // line-height: 40px;
  2184. // background-color: #14928a;
  2185. // .el-dialog__title {
  2186. // color: #fff;
  2187. // font-size: 16px;
  2188. // }
  2189. // }
  2190. .el-checkbox__input.is-checked + .el-checkbox__label {
  2191. color: #606266;
  2192. }
  2193. .sound-container {
  2194. .chioseWrap {
  2195. margin-bottom: 30px;
  2196. display: flex;
  2197. flex-direction: row;
  2198. padding: 0 25px;
  2199. p {
  2200. font-size: 14px;
  2201. margin-right: 30px;
  2202. }
  2203. }
  2204. .topMsg {
  2205. padding: 0 25px;
  2206. display: flex;
  2207. flex-direction: row;
  2208. justify-content: flex-start;
  2209. font-size: 14px;
  2210. color: #444;
  2211. margin-bottom: 15px;
  2212. }
  2213. .subTitle {
  2214. // width: 1203px;
  2215. height: 40px;
  2216. line-height: 40px;
  2217. background-color: #fefceb;
  2218. padding: 0 25px;
  2219. box-sizing: border-box;
  2220. font-size: 16px;
  2221. color: #474747;
  2222. margin-bottom: 20px;
  2223. }
  2224. .floor {
  2225. display: flex;
  2226. flex-direction: row;
  2227. justify-content: flex-start;
  2228. width: 100%;
  2229. height: 48px;
  2230. line-height: 48px;
  2231. background: rgba(237, 238, 240, 1);
  2232. font-size: 14px;
  2233. color: #444;
  2234. align-items: center;
  2235. position: relative;
  2236. z-index: 1;
  2237. .remove {
  2238. width: 98px;
  2239. height: 32px;
  2240. background: rgba(248, 80, 67, 1);
  2241. border-radius: 3px;
  2242. color: #fff;
  2243. line-height: 32px;
  2244. text-align: center;
  2245. margin-left: 164px;
  2246. cursor: pointer;
  2247. }
  2248. .add {
  2249. width: 98px;
  2250. height: 32px;
  2251. background: rgba(20, 146, 138, 1);
  2252. border-radius: 3px;
  2253. color: #fff;
  2254. line-height: 32px;
  2255. text-align: center;
  2256. margin-left: 20px;
  2257. cursor: pointer;
  2258. }
  2259. }
  2260. .xuanze {
  2261. width: 71px;
  2262. }
  2263. .chiose {
  2264. width: 65px;
  2265. height: 24px;
  2266. line-height: 24px;
  2267. border: 1px solid rgba(151, 151, 151, 1);
  2268. border-radius: 12px;
  2269. text-align: center;
  2270. cursor: pointer;
  2271. }
  2272. }
  2273. .soundWrap {
  2274. width: 100%;
  2275. overflow: auto;
  2276. .itemList {
  2277. display: flex;
  2278. flex-direction: row;
  2279. justify-content: flex-start;
  2280. flex-wrap: nowrap;
  2281. flex-grow: 1;
  2282. height: 300px;
  2283. max-height: 300px;
  2284. overflow: auto;
  2285. .categroy {
  2286. width: 150px;
  2287. min-width: 150px;
  2288. .el-checkbox {
  2289. height: 30px;
  2290. line-height: 30px;
  2291. display: block;
  2292. padding-left: 20px;
  2293. }
  2294. p {
  2295. height: 40px;
  2296. line-height: 40px;
  2297. background-color: #edeef0;
  2298. margin-bottom: 15px;
  2299. text-align: center;
  2300. }
  2301. }
  2302. }
  2303. }
  2304. .soundSubP {
  2305. height: 40px;
  2306. line-height: 40px;
  2307. background-color: #edeef0;
  2308. padding-left: 25px;
  2309. }
  2310. .btnWraps {
  2311. display: flex;
  2312. flex-direction: column;
  2313. align-items: center;
  2314. margin-top: 150px;
  2315. .dialogBtn {
  2316. width: 188px;
  2317. height: 40px;
  2318. background: rgba(249, 114, 21, 1);
  2319. border-radius: 4px;
  2320. line-height: 40px;
  2321. color: #fff;
  2322. text-align: center;
  2323. cursor: pointer;
  2324. }
  2325. }
  2326. .btnWrap {
  2327. margin-top: 40px;
  2328. .PrevBtn {
  2329. background-color: #444444;
  2330. width: 120px;
  2331. }
  2332. .submitBtn {
  2333. background-color: #f85043;
  2334. width: 120px;
  2335. }
  2336. }
  2337. .el-icon-plus {
  2338. cursor: pointer;
  2339. }
  2340. .use_price {
  2341. line-height: 52px;
  2342. display: flex;
  2343. align-items: center;
  2344. font-size: 14px;
  2345. font-weight: bold;
  2346. img {
  2347. padding-right: 8px;
  2348. }
  2349. span {
  2350. font-size: 16px;
  2351. }
  2352. }
  2353. .reductionWrap1 {
  2354. background-color: #ededed;
  2355. }
  2356. .reductionWrap {
  2357. width: 100%;
  2358. margin-bottom: 60px;
  2359. .lineWrap {
  2360. display: flex;
  2361. flex-direction: row;
  2362. justify-content: space-around;
  2363. height: 40px;
  2364. line-height: 40px;
  2365. margin-bottom: 10px;
  2366. .item {
  2367. width: 25%;
  2368. text-align: left;
  2369. .el-checkbox {
  2370. margin-right: 5px;
  2371. }
  2372. }
  2373. }
  2374. header {
  2375. height: 40px;
  2376. line-height: 40px;
  2377. color: #000;
  2378. font-size: 17px;
  2379. background: #fff;
  2380. box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.07);
  2381. text-align: center;
  2382. }
  2383. .noticeInfo {
  2384. h2 {
  2385. font-size: 18px;
  2386. color: #1a1a1a;
  2387. // padding-bottom: 10px;
  2388. }
  2389. position: relative;
  2390. // margin-bottom: .1rem;
  2391. background: #fff;
  2392. padding: 15px 15px 10px;
  2393. font-size: 14px;
  2394. color: #808080;
  2395. border-bottom: 1px solid #eaeaea;
  2396. }
  2397. .protocolbtn {
  2398. margin: 35px 0;
  2399. background: #14928a;
  2400. color: #fff;
  2401. font-size: 18px;
  2402. border-radius: 50px;
  2403. text-align: center;
  2404. width: 100%;
  2405. }
  2406. .section {
  2407. padding: 16px 0 10px;
  2408. background: #fff;
  2409. margin-bottom: 10px;
  2410. .line_bottom {
  2411. border-bottom: 1px solid #ededed;
  2412. }
  2413. > .title {
  2414. font-size: 20px;
  2415. line-height: 28px;
  2416. font-weight: bold;
  2417. margin-bottom: 0px;
  2418. padding: 0px 16px;
  2419. // padding-bottom: 5px;
  2420. &::before {
  2421. content: " ";
  2422. width: 4px;
  2423. height: 15px;
  2424. background: #14928a;
  2425. display: inline-block;
  2426. margin-right: 7px;
  2427. border-radius: 8px;
  2428. }
  2429. }
  2430. .indate {
  2431. font-size: 14px;
  2432. padding: 6px 0;
  2433. display: flex;
  2434. // justify-content: space-between;
  2435. justify-content: flex-end;
  2436. span {
  2437. color: #fa101d;
  2438. }
  2439. }
  2440. .coutInfo {
  2441. font-size: 14px;
  2442. color: #905319;
  2443. text-align: left;
  2444. border-top: 1px solid #ededed;
  2445. padding: 12px 16px 12px 31px;
  2446. position: relative;
  2447. background-color: #ffe9d4;
  2448. .trumpet_icon {
  2449. width: 14px;
  2450. height: 12px;
  2451. background: url("../../../assets/images/icon_smallBell.png") no-repeat
  2452. center;
  2453. background-size: contain;
  2454. position: absolute;
  2455. left: 14px;
  2456. top: 16px;
  2457. }
  2458. }
  2459. }
  2460. .options {
  2461. padding-top: 8px;
  2462. .oc {
  2463. padding: 0 16px;
  2464. &:last-child {
  2465. // border-top: 1px solid #ededed;
  2466. margin-top: 8px;
  2467. padding-top: 9px;
  2468. }
  2469. }
  2470. .protocol {
  2471. padding-left: 20px;
  2472. font-size: 10px;
  2473. line-height: 14px;
  2474. }
  2475. &.classInfo {
  2476. padding: 0 16px;
  2477. .option .o_ft {
  2478. color: #444444;
  2479. }
  2480. }
  2481. &.lines {
  2482. margin-top: 5px;
  2483. // border-top: 1px solid #ededed;
  2484. border-bottom: 1px solid #ededed;
  2485. }
  2486. &.sale {
  2487. .option {
  2488. .o_bd,
  2489. .o_ft {
  2490. font-size: 16px;
  2491. color: #ff0000;
  2492. font-weight: bold;
  2493. }
  2494. }
  2495. }
  2496. .option {
  2497. line-height: 26px;
  2498. font-size: 15px;
  2499. display: flex;
  2500. flex-direction: row;
  2501. align-items: center;
  2502. position: relative;
  2503. margin-bottom: 9px;
  2504. .o_bd {
  2505. flex: 1;
  2506. .c {
  2507. font-size: 12px;
  2508. }
  2509. }
  2510. .o_ft {
  2511. font-size: 14px;
  2512. color: #ff0000;
  2513. del {
  2514. color: #aaaaaa;
  2515. font-size: 12px;
  2516. }
  2517. }
  2518. .check_radio {
  2519. margin-right: 8px;
  2520. width: 18px;
  2521. height: 18px;
  2522. background: url("../../../assets/images/icon_radio.png") no-repeat
  2523. center;
  2524. background-size: contain;
  2525. display: inline-block;
  2526. position: relative;
  2527. top: 2px;
  2528. }
  2529. .check_default {
  2530. margin-right: 8px;
  2531. display: block;
  2532. width: 18px;
  2533. height: 18px;
  2534. background-color: #e9eaef;
  2535. border-radius: 50%;
  2536. &.check_active {
  2537. background: url("../../../assets/images/icon_checkbox.png") no-repeat
  2538. center;
  2539. background-size: contain;
  2540. }
  2541. }
  2542. }
  2543. }
  2544. .configuration {
  2545. padding-bottom: 9px;
  2546. .config {
  2547. min-height: 40px;
  2548. }
  2549. .config_line {
  2550. display: flex;
  2551. justify-content: space-between;
  2552. .content {
  2553. width: 70%;
  2554. text-align: right;
  2555. }
  2556. .title {
  2557. font-size: 14px;
  2558. color: #808080;
  2559. span {
  2560. padding-left: 26px;
  2561. }
  2562. }
  2563. }
  2564. .config_other {
  2565. .title {
  2566. background: rgba(246, 246, 246, 1);
  2567. height: 1px;
  2568. position: relative;
  2569. margin: 15px 0;
  2570. span {
  2571. position: absolute;
  2572. left: 12px;
  2573. top: -4px;
  2574. display: inline-block;
  2575. background-color: #fff;
  2576. font-size: 12px;
  2577. padding: 0 40px;
  2578. }
  2579. }
  2580. }
  2581. .content {
  2582. font-size: 12px;
  2583. padding-left: 16px;
  2584. line-height: 22px;
  2585. color: #acacac;
  2586. .o_ft {
  2587. color: #aaaaaa;
  2588. font-size: 12px;
  2589. }
  2590. }
  2591. .options {
  2592. padding-top: 0;
  2593. padding-left: 16px;
  2594. .option {
  2595. font-size: 14px;
  2596. color: #6f6f6f;
  2597. padding: 0;
  2598. }
  2599. }
  2600. }
  2601. .needprice {
  2602. display: flex;
  2603. justify-content: space-between;
  2604. del {
  2605. font-size: 14px;
  2606. color: #aaa;
  2607. font-weight: bold;
  2608. }
  2609. span {
  2610. font-size: 18px;
  2611. color: #f85043;
  2612. font-weight: bold;
  2613. }
  2614. }
  2615. .buy {
  2616. position: absolute;
  2617. margin: 0 auto;
  2618. bottom: 0;
  2619. left: 0;
  2620. right: 0;
  2621. height: 60px;
  2622. width: 440px;
  2623. display: flex;
  2624. flex-direction: row;
  2625. align-items: center;
  2626. padding: 0 20px;
  2627. border-top: 1px solid #ffe9e9e9;
  2628. color: #000000;
  2629. font-size: 12px;
  2630. background: #fff;
  2631. .price {
  2632. flex: 1;
  2633. font-size: 16px;
  2634. }
  2635. font-size: 16px;
  2636. span {
  2637. color: #fa101d;
  2638. }
  2639. .text {
  2640. font-size: 12px;
  2641. width: 60px;
  2642. display: inline-block;
  2643. color: #000;
  2644. }
  2645. del {
  2646. color: #b5b5b5;
  2647. &.text {
  2648. color: #b5b5b5;
  2649. }
  2650. }
  2651. .btn-submit {
  2652. display: inline-block;
  2653. font-size: 18px;
  2654. color: #fff;
  2655. background: #f85043;
  2656. border-radius: 10px;
  2657. box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.19);
  2658. padding: 8px 46px;
  2659. }
  2660. }
  2661. .iframe {
  2662. width: 100%;
  2663. height: 100%;
  2664. -webkit-overflow-scrolling: touch;
  2665. overflow-y: scroll;
  2666. border-top: none !important;
  2667. min-height: calc(100vh - 41px);
  2668. }
  2669. }
  2670. </style>