force-app/main/default/lwc/lexDynamicTable/lexDynamicTable.html
New file @@ -0,0 +1,43 @@ <!-- * @Description: * @version: * @Author: chen jing wu * @Date: 2023-04-27 11:23:11 * @LastEditors: chen jing wu * @LastEditTime: 2023-05-08 11:29:27 --> <template> <lightning-card> <!-- <lightning-button slot="actions" variant="brand" label="Add Row" onclick={addRow}></lightning-button> --> <div class="slds-card__body slds-card__body_inner"> <table class="slds-table slds-table_bordered slds-table_cell-buffer slds-var-m-bottom_large"> <thead> <tr class="slds-text-title_caps"> <template for:each={columns} for:item="column"> <th key={column.apiName}><div class="slds-truncate">{column.label}</div></th> </template> </tr> </thead> <tbody> <template for:each={rows} for:item="row" for:index="index"> <tr class="inputRows" key={row.uuid}> <template for:each={columns} for:item="column"> <td key={column.apiName}> <c-lex-input-pick-list-cell class="fields" field-type={column.fieldType} record={row} field={column.apiName} object-name={column.objectName} value={column.value} read-only={column.readOnly} required={column.required}></c-lex-input-pick-list-cell> <c-lex-input-table-cell class="fields" field-type={column.fieldType} record={row} field={column.apiName} required={column.required}></c-lex-input-table-cell> <c-lex-input-lookup-cell class="fields" field-type={column.fieldType} field-name={column.apiName} record={row} api-name={column.objectName} disable={column.disable} required={column.required}></c-lex-input-lookup-cell> </td> </template> <td> <lightning-button-icon icon-name="utility:add" value={index} variant="bare" onclick={addRow}></lightning-button-icon> </td> <td> <lightning-button-icon icon-name="utility:delete" value={index} variant="bare" onclick={removeRow}></lightning-button-icon> </td> </tr> </template> </tbody> </table> </div> </lightning-card> </template> force-app/main/default/lwc/lexDynamicTable/lexDynamicTable.js
New file @@ -0,0 +1,68 @@ /* * @Description: * @version: * @Author: chen jing wu * @Date: 2023-04-27 11:23:11 * @LastEditors: chen jing wu * @LastEditTime: 2023-05-15 15:37:57 */ import { LightningElement, track, api,wire } from 'lwc'; export default class LexDynamicTable extends LightningElement { @api columnList; @api title; @track columns; @track objectApiName; @track pickListvalues; @track rows = [{ uuid: this.createUUID()}]; connectedCallback() { let cleanedColumnList = this.columnList[0] === '\\' ? this.columnList.substring(1) : this.columnList; if(cleanedColumnList) { this.columns = cleanedColumnList; } } createUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } @api retrieveRecords() { let rows = Array.from(this.template.querySelectorAll(".inputRows") ); var records=[]; rows.map(row => { let texts = Array.from(row.querySelectorAll(".fields")); if(texts) { var textVal=this.fieldValues(texts); records=[...records,textVal]; } }); return records; } fieldValues(cells) { return cells.reduce((record, cell) => { let inputVal = cell.inputValue(); if(inputVal.value!=undefined) { record[inputVal.field] = inputVal.value; } return record; }, {}); } removeRow(event) { const list = this.template.querySelectorAll(['lightning-button-icon']); if(list.length / 2 == 1){ return; } this.rows.splice(event.target.value, 1); } addRow() { this.rows.push({ uuid: this.createUUID()}); } } force-app/main/default/lwc/lexDynamicTable/lexDynamicTable.js-meta.xml
New file @@ -0,0 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>49.0</apiVersion> <description>Dynamic Table</description> <isExposed>true</isExposed> <masterLabel>Dynamic Table</masterLabel> <targets> <target>lightningCommunity__Page</target> <target>lightningCommunity__Default</target> <target>lightning__RecordPage</target> <target>lightning__AppPage</target> <target>lightning__HomePage</target> </targets> </LightningComponentBundle> force-app/main/default/lwc/lexInputLookupCell/lexInputLookupCell.html
New file @@ -0,0 +1,29 @@ <!-- * @Description: * @version: * @Author: chen jing wu * @Date: 2023-04-27 11:38:36 * @LastEditors: chen jing wu * @LastEditTime: 2023-05-08 10:13:58 --> <template> <template if:true={isLookup}> <lightning-record-edit-form object-api-name={apiName} record-id='' > <!-- <template if:true={isDisable}> <lightning-input-field field-name={fieldName} onclick={handleinputChange} variant="label-hidden" disabled="true"> </lightning-input-field> </template> <template if:false={isDisable}> <lightning-input-field field-name={fieldName} onclick={handleinputChange} variant="label-hidden"> </lightning-input-field> </template> --> <template if:true={isRequired}> <lightning-input-field field-name={fieldName} onclick={handleinputChange} variant="label-hidden" disabled={isDisable} required> </lightning-input-field> </template> <template if:false={isRequired}> <lightning-input-field field-name={fieldName} onclick={handleinputChange} variant="label-hidden" disabled={isDisable}> </lightning-input-field> </template> </lightning-record-edit-form> </template> </template> force-app/main/default/lwc/lexInputLookupCell/lexInputLookupCell.js
New file @@ -0,0 +1,53 @@ /* * @Description: * @version: * @Author: chen jing wu * @Date: 2023-04-27 11:38:36 * @LastEditors: chen jing wu * @LastEditTime: 2023-05-08 10:25:31 */ import { LightningElement, api } from 'lwc'; export default class LexInputLookupCell extends LightningElement { @api record; @api fieldName; @api apiName; @api type; @api fieldType; @api disable; @api required; value; label; connectedCallback() { this.value = this.record[this.fieldName]; this.label = this.fieldName; } get isRequired(){ return this.required; } handleInputChange(event) { this.value = event.target.value; } get isDisable(){ if(this.disable == true){ return true; }else{ return false; } } getSearchResult(){ } @api inputValue() { return { value : this.value, field: this.field }; } get isLookup() { if(this.fieldType) { return this.fieldType.toLowerCase()=='lookup'; } return false; } } force-app/main/default/lwc/lexInputLookupCell/lexInputLookupCell.js-meta.xml
New file @@ -0,0 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>49.0</apiVersion> <description>Lookup Component</description> <isExposed>true</isExposed> <masterLabel>Lookup Component</masterLabel> <targets> <target>lightningCommunity__Page</target> <target>lightningCommunity__Default</target> <target>lightning__RecordPage</target> <target>lightning__AppPage</target> <target>lightning__HomePage</target> <target>lightning__FlowScreen</target> </targets> </LightningComponentBundle> force-app/main/default/lwc/lexInputPickListCell/lexInputPickListCell.html
New file @@ -0,0 +1,49 @@ <!-- * @Description: * @version: * @Author: chen jing wu * @Date: 2023-04-27 11:15:23 * @LastEditors: chen jing wu * @LastEditTime: 2023-05-08 11:04:56 --> <template> <template if:true={isPickList}> <!-- <template if:true={isReadOnly}> <lightning-combobox name="progress" variant="label-hidden" value={value} placeholder={value} options={options} onchange={handleChange} readonly="true"></lightning-combobox> </template> <template if:false={isReadOnly}> <lightning-combobox name="progress" variant="label-hidden" value={value} placeholder="--无--" options={options} onchange={handleChange} ></lightning-combobox> </template> --> <template if:true={isRequired}> <lightning-combobox name="progress" variant="label-hidden" value={value} placeholder="--无--" options={options} onchange={handleChange} readonly={isReadOnly} required></lightning-combobox> </template> <template if:false={isRequired}> <lightning-combobox name="progress" variant="label-hidden" value={value} placeholder="--无--" options={options} onchange={handleChange} readonly={isReadOnly}></lightning-combobox> </template> </template> </template> force-app/main/default/lwc/lexInputPickListCell/lexInputPickListCell.js
New file @@ -0,0 +1,84 @@ /* * @Description: * @version: * @Author: chen jing wu * @Date: 2023-04-27 11:15:23 * @LastEditors: chen jing wu * @LastEditTime: 2023-05-08 11:39:23 */ import { LightningElement, track,wire, api } from 'lwc'; import getPickList from '@salesforce/apex/lexPCLLostReportLwcController.getPickList'; import searchBrands from '@salesforce/apex/lexPCLLostReportLwcController.searchBrands'; export default class LexInputPickListCell extends LightningElement { @track options=[]; @api value; @api record; @api field; @api fieldType; @api objectName; @api readOnly; @api required; value1; label; connectedCallback() { this.value1 = this.record[this.field]; this.label = this.field; if(this.objectName!==undefined && this.isPickList) { if(this.label!= 'LostBrandName__c'){ this.getPicklist(this.objectName,this.field); }else{ this.getSearchBrands(); } } } get isRequired(){ return this.required; } getSearchBrands(){ searchBrands().then(result=>{ this.options = JSON.parse(result); }); } getPicklist(obj,field) { getPickList({ objectName : obj, fieldName :field}) .then(result => { if(result) { for(let i=0; i<result.length; i++) { console.log('id=' + result[i]); this.options = [...this.options ,{value: result[i] , label: result[i]}]; } this.error = undefined; } }) .catch(error => { this.message = undefined; this.error = error; }); } handleChange(event) { this.value = event.target.value; } get isPickList() { if(this.fieldType) { return this.fieldType.toLowerCase()=='picklist'; } return false; } get isReadOnly(){ if(this.readOnly == true){ return true; }else{ return false; } } @api inputValue() { return { value : this.value, field: this.field }; } } force-app/main/default/lwc/lexInputPickListCell/lexInputPickListCell.js-meta.xml
New file @@ -0,0 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>49.0</apiVersion> <description>PickList Component</description> <isExposed>true</isExposed> <masterLabel>PickList Component</masterLabel> <targets> <target>lightningCommunity__Page</target> <target>lightningCommunity__Default</target> <target>lightning__RecordPage</target> <target>lightning__AppPage</target> <target>lightning__HomePage</target> <target>lightning__FlowScreen</target> </targets> </LightningComponentBundle> force-app/main/default/lwc/lexInputTableCell/lexInputTableCell.html
New file @@ -0,0 +1,28 @@ <!-- * @Description: * @version: * @Author: chen jing wu * @Date: 2023-04-27 11:12:28 * @LastEditors: chen jing wu * @LastEditTime: 2023-05-08 11:43:29 --> <template> <template if:true={isText}> <!-- <lightning-input type={type} variant="label-hidden" label={field} name={field} value={value} onchange={handleInputChange}></lightning-input> --> <template if:true={isRequired}> <lightning-input type={type} variant="label-hidden" label={field} name={field} value={value} onchange={handleInputChange} required></lightning-input> </template> <template if:false={isRequired}> <lightning-input type={type} variant="label-hidden" label={field} name={field} value={value} onchange={handleInputChange}></lightning-input> </template> </template> <template if:true={isNumber}> <!-- <lightning-input type={type} variant="label-hidden" label={field} name={field} value={value} onchange={handleInputChange}></lightning-input> --> <template if:true={isRequired}> <lightning-input type={type} variant="label-hidden" label={field} name={field} value={value} onchange={handleInputChange} required></lightning-input> </template> <template if:false={isRequired}> <lightning-input type={type} variant="label-hidden" label={field} name={field} value={value} onchange={handleInputChange}></lightning-input> </template> </template> </template> force-app/main/default/lwc/lexInputTableCell/lexInputTableCell.js
New file @@ -0,0 +1,52 @@ /* * @Description: * @version: * @Author: chen jing wu * @Date: 2023-04-27 11:12:28 * @LastEditors: chen jing wu * @LastEditTime: 2023-05-08 11:46:35 */ import { LightningElement, api } from 'lwc'; export default class LexInputTableCell extends LightningElement { @api record; @api field; @api fieldType; @api type; @api required; value; label; connectedCallback() { this.value = this.record[this.field]; this.label = this.field; this.type='text'; } get isRequired(){ return this.required; } handleInputChange(event) { this.value = event.target.value; } @api inputValue() { return { value : this.value, field: this.field }; } get isText() { if(this.fieldType) { this.type = 'text'; return this.fieldType.toLowerCase()=='text'; } return false; } get isNumber(){ if(this.fieldType) { this.type = 'number'; return this.fieldType.toLowerCase()=='number'; } return false; } } force-app/main/default/lwc/lexInputTableCell/lexInputTableCell.js-meta.xml
New file @@ -0,0 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>49.0</apiVersion> <description>Input Cell component</description> <isExposed>true</isExposed> <masterLabel>Input Cell component</masterLabel> <targets> <target>lightningCommunity__Page</target> <target>lightningCommunity__Default</target> <target>lightning__RecordPage</target> <target>lightning__AppPage</target> <target>lightning__HomePage</target> <target>lightning__FlowScreen</target> </targets> </LightningComponentBundle> force-app/main/default/lwc/lexPCLLostReportPage/lexPCLLostReportPage.css
@@ -18,4 +18,39 @@ .slds-form-element__label { width: 144px; margin-right: -5rem; } } .myinitDiv{ } .card{ } .my-addbutton{ -webkit-text-size-adjust: 100%; font-family: -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol'; line-height: normal; color: rgb(3, 45, 96); -webkit-tap-highlight-color: transparent; border-spacing: 0; border-collapse: separate; font-size: 13px; white-space: normal; box-sizing: border-box; border: 0; } .container { display: flex; justify-content: space-between; /* 设置子元素间的间距 */ } .item { flex: 1; /* 设置子元素的伸缩比例,平分剩余空间 / max-width: 100%; / 防止子元素溢出容器 */ } .text-container p:first-line { background-color: rgb(243, 243, 243); } force-app/main/default/lwc/lexPCLLostReportPage/lexPCLLostReportPage.html
@@ -4,154 +4,102 @@ * @Author: chen jing wu * @Date: 2023-04-20 17:16:48 * @LastEditors: chen jing wu * @LastEditTime: 2023-04-26 14:07:51 * @LastEditTime: 2023-05-16 11:41:50 --> <template> <lightning-card variant="Narrow"> <!-- <lightning-input onchange={initAll}></lightning-input> --> <lightning-card id="my-element" class="card" variant="Narrow" data-id="my-card"> <div style="padding: 0 20px"> <lightning-layout> <lightning-layout-item> <div class="mainTitle" style="padding: 10px 3px;font-weight: bold;">失单报告编辑页面</div> </lightning-layout-item> <div class="slds-align_absolute-center"> <lightning-layout-item size="12"> <div style="margin-left: 550px;"> <lightning-layout-item size="12"> <lightning-button label="追加品牌" onclick={addBrandJs}></lightning-button> <lightning-button label="保存" onclick={saveJs}></lightning-button> <lightning-button name="save" label="保存" onclick={saveBrandJs}></lightning-button> <lightning-button label="返回询价" onclick={cancel}></lightning-button> </lightning-layout-item> </div> <!-- <lightning-layout-item flexibility="auto" padding="around-small"> <lightning-button label="保存" onclick={saveJs}></lightning-button> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="around-small"> <lightning-button label="返回询价" onclick={cancel}></lightning-button> </lightning-layout-item> --> </lightning-layout> <div style="margin-top: 5px"> <lightning-layout> <lightning-layout-item size="2" padding="around-small"> <!-- <div class="combobox-container"> <label for="losttype">失单类型:</label> <lightning-combobox id="losttype" name="progress" value={lostReportObj.RecordType} options={RecordTypeOptions} onchange={handleStatus1Change} class="searchField" style="width: 71.33px; height: 32px;"> </lightning-combobox> </div> --> <div class="slds-form_horizontal my-combobox"> <label class="slds-form-element__label">失单类型:</label> <lightning-combobox name="progress" value="失单" options={RecordTypeOptions} onchange={handleStatus1Change} class="searchField" style="width: 71.33px; height: 32px;"> <lightning-combobox name="progress" value={LostReport.lostReport.LostType__c} options={RecordTypeOptions} onchange={handleLostTypeChange} class="searchField" required> </lightning-combobox> </div> </lightning-layout-item> <lightning-layout-item size="3" padding="around-small"> <div style="padding: 10px 3px;font: 16px;">失单总金额(元):</div> <!-- <lightning-output-field>{LostReport.lostReport.LostTotalAmount__c}</lightning-output-field> --> <lightning-output-field>0</lightning-output-field> <div style="padding: 10px 3px;font: 16px;">失单总金额(元):{LostReport.lostReport.LostTotalAmount__c}</div> </lightning-layout-item> <lightning-layout-item size="3" padding="around-small"> <div style="padding: 10px 3px;font: 16px;">状态:</div> <!-- <lightning-output-field>{LostReport.lostReport.Report_Status__c}</lightning-output-field> --> <div style="padding: 10px 3px;font: 16px;">状态:{LostReport.lostReport.Report_Status__c}</div> </lightning-layout-item> </lightning-layout> <lightning-accordion allow-multiple-sections-open> <lightning-accordion-section name="失单品牌" label="失单品牌"> <lightning-layout> <lightning-layout-item size="4" padding="around-small"> <c-multi-select-combobox multis-select="true" options={brandOptions} selected-value= "asd" label="失单品牌: "></c-multi-select-combobox> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="around-small"> <lightning-combobox name="progress" label="失单原因(主):" value="" options={status1Options} onchange={handleStatus1Change} class="searchField"></lightning-combobox> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="around-small"> <lightning-combobox name="progress" label="失单原因(次):" value="" options={status1Options} onchange={handleStatus1Change} class="searchField"></lightning-combobox> </lightning-layout-item> </lightning-layout> <lightning-layout> <lightning-layout-item size="4" padding="horizontal-small"> <lightning-input value="" type="text" label="失单品牌(手动): " class="searchField" onchange={handleRepairNameChange}></lightning-input> </lightning-layout-item> <lightning-layout-item size="4" padding="horizontal-small"> <lightning-input value="" type="text" label="失单金额(元): " class="searchField" onchange={handleRepairNameChange}></lightning-input> </lightning-layout-item> <lightning-layout-item size="4" padding="horizontal-small"> <lightning-record-edit-form object-api-name='PCLLostBrand__c' record-id='' > <lightning-input-field field-name='Agency__c' onclick={handleWinBidAgencyChange}> </lightning-input-field> </lightning-record-edit-form> </lightning-layout-item> </lightning-layout> <lightning-layout> <lightning-layout-item size="4" padding="horizontal-small"> <lightning-input value="" type="text" label="中标经销商(手动):" class="searchField" onchange={handleRepairNameChange}></lightning-input> </lightning-layout-item> </lightning-layout> <lightning-layout style="background-color: rgb(243, 243, 243)"> <div></div> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <div>失单品牌</div> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <div>失单对手型号</div> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <div>失单数量</div> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <div>失单对手型号(手动)</div> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <div>失单产品类别</div> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <div>失单产品区分</div> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <div>+</div> </lightning-layout-item> </lightning-layout> <lightning-layout> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <lightning-combobox name="progress" value="" options={status1Options} onchange={handleStatus1Change} class="searchField"></lightning-combobox> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <lightning-record-edit-form object-api-name='PCLLostProduct__c' record-id='' > <lightning-input-field field-name='LostProduct__c' onclick={handleWinBidAgencyChange}> </lightning-input-field> </lightning-record-edit-form> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <lightning-input value="" type="text" class="searchField" onchange={handleRepairNameChange}></lightning-input> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <lightning-input value="" type="text" class="searchField" onchange={handleRepairNameChange}></lightning-input> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <lightning-combobox name="progress" value="" options={status1Options} onchange={handleStatus1Change} class="searchField"></lightning-combobox> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <lightning-combobox name="progress" value="" options={status1Options} onchange={handleStatus1Change} class="searchField"></lightning-combobox> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="horizontal-small"> <lightning-button label="Add Contact" variant="brand" onclick={handleAddClick}> </lightning-button> </lightning-layout-item> </lightning-layout> </lightning-accordion-section> <lightning-accordion allow-multiple-sections-open class="myAccordion"> <template for:each={LostReport.LostBrands} for:item="brand" for:index="i"> <li key={brand.index}> <lightning-accordion-section class="text-container" data-id={i} name="失单品牌" label="失单品牌"> <lightning-button name={i} label="保存" onclick={saveBrandJs}></lightning-button> <lightning-button name={i} label="删除" onclick={deleteBrandJs} disabled={isBrandCount2}></lightning-button> <lightning-layout> <lightning-layout-item size="4" padding="around-small"> <c-multi-select-combobox name={i} onselect={setBrandMannualName} data-id="Lost_By_Company" class="mycombobox" options={brandOptions} selected-value={reasonValue} label="失单品牌: " required></c-multi-select-combobox> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="around-small"> <lightning-combobox name={i} label="失单原因(主):" value="" options={columns2} onchange={handleLostReasonMainChange} class="searchField" required></lightning-combobox> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="around-small"> <lightning-combobox name={i} label="失单原因(次):" value="" options={columns2} onchange={handleLostReasonSubChange} class="searchField"></lightning-combobox> </lightning-layout-item> </lightning-layout> <lightning-layout> <lightning-layout-item size="4" padding="horizontal-small"> <lightning-input name={i} data-id="Lost_By_Company_Mannual" value="" type="text" label="失单品牌(手动): " class="searchField" onchange={handleLostByCompanyMannualChange}></lightning-input> </lightning-layout-item> <lightning-layout-item size="4" padding="horizontal-small"> <lightning-input data-id="TotalAmount" name={i} value="" type="number" label="失单金额(元): " class="searchField" onchange={handleLostPriceOutChange} required></lightning-input> </lightning-layout-item> <lightning-layout-item size="4" padding="horizontal-small"> <lightning-record-edit-form object-api-name='PCLLostBrand__c' record-id='' > <lightning-input-field name={i} field-name='Agency__c' onchange={handleAgencyOutChange} required> </lightning-input-field> </lightning-record-edit-form> </lightning-layout-item> </lightning-layout> <lightning-layout> <lightning-layout-item size="4" padding="horizontal-small"> <lightning-input name={i} value="" type="text" label="中标经销商(手动):" class="searchField" onchange={handleAgencyMannualOutChange}></lightning-input> </lightning-layout-item> </lightning-layout> <lightning-layout> <lightning-layout-item flexibility="auto" padding="around-small"> <template if:true={isInit}> <c-lex-dynamic-table name={i} column-list={brand.columns} onchange={setProductClass}> </c-lex-dynamic-table> </template> </lightning-layout-item> </lightning-layout> </lightning-accordion-section> </li> </template> </lightning-accordion> <lightning-layout style="margin-top: 20px;"> <div class="slds-align_absolute-center"> <lightning-layout-item size="12"> <lightning-button label="追加品牌" onclick={addBrandJs}></lightning-button> <lightning-button name="save" label="保存" onclick={saveBrandJs}></lightning-button> <lightning-button label="返回询价" onclick={cancel}></lightning-button> </lightning-layout-item> </div> </lightning-layout> </div> </div> </div> </lightning-card> </template> force-app/main/default/lwc/lexPCLLostReportPage/lexPCLLostReportPage.js
@@ -4,89 +4,105 @@ * @Author: chen jing wu * @Date: 2023-04-20 15:04:03 * @LastEditors: chen jing wu * @LastEditTime: 2023-04-26 11:45:00 * @LastEditTime: 2023-05-16 11:43:27 */ /* * @Description: * @version: * @Author: chen jing wu * @Date: 2023-04-20 15:04:03 * @LastEditors: chen jing wu * @LastEditTime: 2023-04-20 17:11:01 */ const columns = [ { label: '失单品牌', fieldName: 'LostBrandName__c', type: 'list', editable: true }, { label: '失单对手型号', fieldName: 'LostProductName__c', type: 'text', editable: true }, { label: '失单数量', fieldName: 'Quantity__c', type: 'number', editable: true }, { label: '失单对手型号(手动)', fieldName: 'LostProductMannual__c', type: 'text', editable: true }, { label: '失单产品类别', fieldName: 'ProductClass__c', type: 'list', editable: true }, { label: '失单产品区分', fieldName: 'ProductCategory__c', type: 'list', editable: true } // ... ]; const columns2=[ { label: '--无--', value: '' }, { label: '无信息,跟进不及时', value: '无信息,跟进不及时' }, { label: '价格', value: '价格' }, { label: '医生偏好', value: '医生偏好' }, { label: '服务不到位', value: '服务不到位' }, { label: '行政决策', value: '行政决策' }, { label: '竞品原有基础上增添设备', value: '竞品原有基础上增添设备' }, { label: '渠道因素', value: '渠道因素' }, { label: '某种产品缺失', value: '某种产品缺失' }, { label: '采购平衡', value: '采购平衡' } ]; import { api, wire,track,LightningElement } from 'lwc'; import { CurrentPageReference } from "lightning/navigation"; import save from '@salesforce/apex/lexPCLLostReportLwcController.save'; import dataEntry from '@salesforce/apex/lexPCLLostReportLwcController.dataEntry'; import { ShowToastEvent } from 'lightning/platformShowToastEvent'; import { loadStyle, loadScript } from 'lightning/platformResourceLoader'; import setbrand from '@salesforce/apex/lexPCLLostReportLwcController.setBrand'; import init from '@salesforce/apex/lexPCLLostReportLwcController.init'; import initForApex from '@salesforce/apex/lexPCLLostReportLwcController.initForApex'; import multiSelectCombobox from 'c/multiSelectCombobox' import lexMultiSelectCombobox from 'c/lexmultiSelectCombobox'; import searchBrands from '@salesforce/apex/lexPCLLostReportLwcController.searchBrands'; export default class LexPCLLostReportPage extends LightningElement { @api oppId = '0061000001R2xjWAAR'; @api lostReportId; @api pageStatus = 'Create'; @api lostType = '失单'; @api submitFlag; searchResult; LostReport; brandCount; brandOptions = []; connectedCallback() { this.initAll(); import getNewLostBrand from '@salesforce/apex/lexPCLLostReportLwcController.getNewLostBrand'; import { NavigationMixin } from 'lightning/navigation'; import {CloseActionScreenEvent} from 'lightning/actions'; export default class LexPCLLostReportPage extends NavigationMixin(LightningElement) { @track records; @api recordJson; @track columns2=columns2; @api reasonValue; @api oppId; lostReportId = ''; pageStatus = 'Create'; lostType = '失单'; submitFlag = ''; flag; @track LostReport = { LostBrands: [ ], lostReport: {} }; @track brandOptions = []; columns=[ { "label" : "失单品牌", "apiName" : "LostBrandName__c" ,"fieldType":"picklist","objectName":"PCLLostProduct__c", "readOnly":true,"value":"--无--","required":false}, { "label" : "失单对手型号", "apiName" : "LostProduct__c" ,"fieldType":"lookup","objectName":"PCLLostProduct__c","disable":"false","searchfield":"'无'","required":false}, { "label" : "失单数量", "apiName" : "Quantity__c","fieldType":"number","objectName":"PCLLostProduct__c" ,"required":true}, { "label" : "失单对手型号(手动)", "apiName" : "LostProductMannual__c","fieldType":"text","objectName":"PCLLostProduct__c" ,"required":false}, { "label" : "失单产品类别", "apiName" : "ProductClass__c","fieldType":"picklist","objectName":"PCLLostProduct__c" ,"required":true}, { "label" : "失单产品区分", "apiName" : "ProductCategory__c","fieldType":"picklist","objectName":"PCLLostProduct__c","required":true} ]; connectedCallback(){ init({ oppId1: this.oppId, lostReportId1: this.lostReportId, pageStatus1: this.pageStatus, lostType1: this.lostType, submitFlag1: this.submitFlag }).then(result=>{ console.log(result); if(result.message != null){ if(result.message == '提交成功!'){ this.showToast(result.message,"success"); this.LostReport = result.LostReport; }else{ this.showToast(result.message,"error"); } }else{ this.LostReport = result.LostReport; this.LostReport.lostReport.LostTotalAmount__c = 0.0; this.LostReport.LostBrands[0].columns = JSON.parse(JSON.stringify(this.columns)); } }).catch(error=>{ console.log("error"); console.log(error); }); searchBrands().then(result=>{ this.brandOptions = JSON.parse(result); console.log(this.brandOptions); const multiCombobox = this.template.querySelector('c-multi-select-combobox'); multiCombobox.refreshOptions(this.brandOptions); const multiComboboxs = this.template.querySelectorAll('c-multi-select-combobox'); multiComboboxs.forEach(multiCombobox=>{ multiCombobox.refreshOptions(this.brandOptions); }); }).catch(error=>{ console.log("error"); console.log(error); }); } get isInit(){ if(this.LostReport.LostBrands[0].columns == undefined){ return false; }else{ return true; } } //失单类型 RecordTypeOptions = [{ label: '--无--', value: '' }, { label: '失单', value: '失单' }, @@ -106,80 +122,20 @@ } } } // connectedCallback(){ // this.initAll(); // } // connectedCallback(){ // console.log("1"); // initForApex({ // oppId1: this.oppId, // lostReportId1: this.lostReportId, // pageStatus1: this.pageStatus, // lostType1: this.lostType, // submitFlag1: this.submitFlag // }).then(()=>{ // console.log("2"); // init().then(result=>{ // console.log("3"); // console.log(result); // if(result.message == '提交成功!'){ // this.showToast(result.message,"success"); // this.LostReport = result.LostReport; // }else{ // console.log("211"); // this.showToast(result.message,"error"); // console.log("985"); // } // }); // }); // } initAll(){ console.log(this.oppId); console.log(this.lostReportId); console.log(this.pageStatus); console.log(this.lostType); console.log(this.submitFlag); initForApex({ oppId1: this.oppId, lostReportId1: this.lostReportId, pageStatus1: this.pageStatus, lostType1: this.lostType, submitFlag1: this.submitFlag }).then(()=>{ console.log("2"); init().then(result=>{ console.log("3"); console.log(result); if(result.message == '提交成功!'){ this.showToast(result.message,"success"); this.LostReport = result.LostReport; }else{ console.log("211"); //this.showToast(result.message,"error"); console.log("985"); } }); }); getBrandLabel(index){ return "失单品牌" + (this.LostReport.LostBrands[index].lineno + 1); } getParamValue(paramName) { // Use the URLSearchParams API to get the value of a query parameter const params = new URLSearchParams(window.location.search); return params.get(paramName); } saveJs() { save().then(result=>{ if(result){ this.showToast(result,"success"); this.clearBrandMannualName(); } }) } addBrandJs() { addBrand().then(()=>{ getNewLostBrand({ lineNo: this.LostReport.LostBrands.length }).then(result=>{ this.LostReport.LostBrands.push(result); this.LostReport.LostBrands[this.LostReport.LostBrands.length - 1].columns = JSON.parse(JSON.stringify(this.columns)); }); } submitJS() { @@ -199,81 +155,78 @@ } }); } addProductJs(number) { addProduct().then(()=>{ }); } RemoveJs(number) { Remove().then(()=>{ }); } // add tcm 20211118 start searchJs(topNum, secondNum) { search().then(()=>{ }); } get pageStatusIsCreateOrEdit() { return this.pageStatus === 'Create' || this.pageStatus === 'Edit'; } get isBrandCount2(){ var flag = true; if(this.LostReport.LostBrands.length > 1){ flag = false; } return flag; } deleteBrandJs(event){ var str = event.target.name; this.columnsArrIndex = 0; this.LostReport.LostBrands.splice(str,1); } // add tcm 20211118 end setLostTotalAmount() { //console.log('setLostTotalAmount start:'); var totalAmount = this.template.querySelector('[data-id="LostTotalAmount"]'); var totalAmountHidden = this.template.querySelector('[data-id="LostTotalAmountHidden"]'); var brandAmountObjects = this.template.querySelectorAll('[data-id^="BrandContent:LostPriceOut"]'); var brandCompanyObjects = this.template.querySelectorAll('[data-id^="BrandContent:Lost_By_CompanyOut"]'); if (!!totalAmount && !!totalAmountHidden) { var tempLostAmount = 0.0; var brandCount = parseInt(this.brandCount); //console.log(brandCount); for (var i = 0; i < brandCount; i++) { var brandAmountObject = brandAmountObjects[i]; var brandCompanyObject = brandCompanyObjects[i]; if (!!brandAmountObject && !!brandCompanyObject) { var brandCompanyText = brandCompanyObject.innerText; var brandCompanyValue = brandCompanyObject.value; if (!!brandCompanyText && brandCompanyText !== '--无--' && !!brandCompanyValue) { var brandAmount = parseFloat(brandAmountObject.value); tempLostAmount = tempLostAmount + brandAmount; } } var elements = this.template.querySelectorAll('[data-id="TotalAmount"]'); var tempLostAmount = 0.0; elements.forEach(element => { console.log(element.value); if(element.value != 0){ tempLostAmount = tempLostAmount + parseFloat(element.value); } totalAmount.innerHTML = toNumComma(tempLostAmount); totalAmountHidden.value = tempLostAmount; } //console.log('setLostTotalAmount end'); }); this.LostReport.lostReport.LostTotalAmount__c = tempLostAmount; } setBrandName(brandNumber) { setbrand().then(()=>{ this.clearBrandMannualName(); }); } setBrandMannualName(brandNumber) { setbrandmannual().then(()=>{ }); setBrandMannualName(event) { var index = event.target.name; const payload = event.detail.payload; const payloadType = event.detail.payloadType; this.LostReport.LostBrands[index].lostBrand.Lost_By_Company__c = payload.value; if(payloadType === 'multi-select'){ this.setDefaultBrand(payload.value,index); this.clearBrandMannualName(payload.value,index); } } setDefaultBrand(value,index){ this.LostReport.LostBrands[index].columns[0].value = value; } // 失单品牌不等于其他时,失单品牌(手动)清空并且不允许填写,失单品牌等于其他时,失单对手型号不可用 thh 2022-01-13 start clearBrandMannualName(){ if (this.template.querySelector('[id$="Lost_By_CompanyOut"]').value === '其他') { this.template.querySelector('[id$="LostProduct"]').setAttribute('disabled', true); clearBrandMannualName(value,index){ if (value == '其他') { var elements = this.template.querySelectorAll('[data-id="Lost_By_Company_Mannual"]'); elements[index].disabled = false; this.LostReport.LostBrands[index].columns[1].disable = true; } else { this.template.querySelector('[id$="Lost_By_Company_MannualOut:Lost_By_Company_Mannual"]').value = ''; this.template.querySelector('[id$="Lost_By_Company_MannualOut:Lost_By_Company_Mannual"]').setAttribute('disabled', true); var elements = this.template.querySelectorAll('[data-id="Lost_By_Company_Mannual"]'); elements[index].value = ''; elements[index].disabled = true; this.LostReport.LostBrands[index].columns[1].disable = false; } } cancel() { // Navigate to the specified opportunity page using the NavigationMixin this[NavigationMixin.Navigate]({ type: 'standard__recordPage', attributes: { recordId: this.oppId, actionName: 'view' } }); this[NavigationMixin.Navigate]({ type: 'standard__recordPage', attributes: { recordId: this.oppId, actionName: 'view' } }); } showToast(msg,type) { const event = new ShowToastEvent({ @@ -284,5 +237,206 @@ this.dispatchEvent(event); this.dispatchEvent(new CloseActionScreenEvent()); } saveBrandJs(event) { var index = event.target.name; var tables = this.template.querySelectorAll("c-lex-dynamic-table"); if(tables.length > 1){ if(index == "save"){ for(let i=0;i < table.length;i++){ var products = this.LostReport.LostBrands[i].LostProducts; var table = tables[i]; if(table!=undefined){ var records = table.retrieveRecords(); for(let j=0;j<records.length - 1;j++){ products.push(JSON.parse(JSON.stringify(products[0]))); } for(let j=0;j<records.length;j++){ products[j].LostProductss.LostBrandName__c = records[j].LostBrandName__c; products[j].LostProductss.Quantity__c = records[j].Quantity__c; products[j].LostProductss.LostProductMannual__c = records[j].LostProductMannual__c; products[j].LostProductss.ProductClass__c = records[j].ProductClass__c; products[j].LostProductss.ProductCategory__c = records[j].ProductCategory__c; products[j].LostProductss.LostProduct__c = records[j].LostProduct__c; } } } }else{ var products = this.LostReport.LostBrands[index].LostProducts; var table = tables[index]; if(table!=undefined){ var records = table.retrieveRecords(); for(let i=0;i<records.length - 1;i++){ products.push(JSON.parse(JSON.stringify(products[0]))); } for(let i=0;i<records.length;i++){ products[i].LostProductss.LostBrandName__c = records[i].LostBrandName__c; products[i].LostProductss.Quantity__c = records[i].Quantity__c; products[i].LostProductss.LostProductMannual__c = records[i].LostProductMannual__c; products[i].LostProductss.ProductClass__c = records[i].ProductClass__c; products[i].LostProductss.ProductCategory__c = records[i].ProductCategory__c; products[i].LostProductss.LostProduct__c = records[i].LostProduct__c; } } } }else{ var products = this.LostReport.LostBrands[0].LostProducts; var table = tables[0]; if(table!=undefined){ var records = table.retrieveRecords(); console.log(JSON.stringify(records)); if(records.length > 1){ for(let i=0;i<records.length - 1;i++){ products.push(JSON.parse(JSON.stringify(products[0]))); } } for(let i=0;i<records.length;i++){ products[i].LostProductss.LostBrandName__c = records[i].LostBrandName__c; products[i].LostProductss.Quantity__c = records[i].Quantity__c; products[i].LostProductss.LostProductMannual__c = records[i].LostProductMannual__c; products[i].LostProductss.ProductClass__c = records[i].ProductClass__c; products[i].LostProductss.ProductCategory__c = records[i].ProductCategory__c; products[i].LostProductss.LostProduct__c = records[i].LostProduct__c; } } } this.dataCheck(); if(!this.flag){ return; } dataEntry({ report1 : JSON.stringify(this.LostReport) }).then(result=>{ if(result){ this.showToast(result,"error") } }).catch(error=>{ console.log("error"); console.log(error); }); } handleLostTypeChange(event){ var value = event.target.value; this.LostReport.lostReport.LostType__c = value; } handleLostReasonMainChange(event){ var index = event.target.name; var value = event.target.value; this.LostReport.LostBrands[index].lostBrand.Lost_reason_main__c = value; } handleLostReasonSubChange(event){ var index = event.target.name; var value = event.target.value; this.LostReport.LostBrands[index].lostBrand.Lost_Reason_Sub__c = value; } handleLostByCompanyMannualChange(event){ var index = event.target.name; var value = event.target.value; this.LostReport.LostBrands[index].lostBrand.Lost_By_Company_Mannual__c = value; } handleLostPriceOutChange(event){ var index = event.target.name; var value = event.target.value; this.LostReport.LostBrands[index].lostBrand.LostPrice__c = value; this.setLostTotalAmount(); } handleAgencyOutChange(event){ var index = event.target.name; var value = event.target.value; this.LostReport.LostBrands[index].lostBrand.Agency__c = value; } handleAgencyMannualOutChange(event){ var index = event.target.name; var value = event.target.value; this.LostReport.LostBrands[index].lostBrand.AgencyMannual__c = value; } dataCheck(){ this.flag = true; if(this.LostReport.lostReport.LostType__c == undefined || this.isBlank(this.LostReport.lostReport.LostType__c)) { this.flag = false; this.showToast('必须填写失单类型!','error'); } this.LostReport.LostBrands.forEach(tempLostBrand=>{ if(tempLostBrand.lostBrand.Lost_By_Company__c == undefined || this.isBlank(tempLostBrand.lostBrand.Lost_By_Company__c)) { this.flag = false; this.showToast('请填写失单品牌!','error'); }// fy SWAG-CCC6F6 start else if(tempLostBrand.lostBrand.Lost_By_Company__c == '其他' && (tempLostBrand.lostBrand.Lost_By_Company_Mannual__c == undefined || this.isBlank(tempLostBrand.lostBrand.Lost_By_Company_Mannual__c))){ this.flag = false; this.showToast('请填写失单品牌(手动)!','error'); }// fy SWAG-CCC6F6 end if(tempLostBrand.lostBrand.LostPrice__c == undefined || this.isBlank(tempLostBrand.lostBrand.LostPrice__c)) { this.flag = false; this.showToast('失单金额必填!','error'); } if(tempLostBrand.lostBrand.Lost_reason_main__c == undefined || this.isBlank(tempLostBrand.lostBrand.Lost_reason_main__c)) { this.flag = false; this.showToast('失单理由(主)必填!','error'); } if(tempLostBrand.lostBrand.Agency__c == undefined || this.isBlank(tempLostBrand.lostBrand.Agency__c)) { this.flag= false; this.showToast('中标经销商必填!','error'); } // 检查是否有超过1个有数的产品 var productCount = 0; tempLostBrand.LostProducts.forEach(temlostProduct=>{ if ((temlostProduct.LostProductss.LostProduct__c != undefined && !this.isBlank(temlostProduct.LostProductss.LostProduct__c)) || (temlostProduct.LostProductss.LostProductMannual__c != undefined && !this.isBlank(temlostProduct.LostProductss.LostProductMannual__c))) { productCount ++; } // update tcm 20211123 start if(((temlostProduct.LostProductss.LostProduct__c!= undefined && !this.isBlank(temlostProduct.LostProductss.LostProduct__c)) || (temlostProduct.LostProductss.LostProductMannual__c!=undefined && !this.isBlank(temlostProduct.LostProductss.LostProductMannual__c)))&&(temlostProduct.LostProductss.Quantity__c==undefined || this.isBlank(temlostProduct.LostProductss.Quantity__c) || temlostProduct.LostProductss.Quantity__c ==0)) { this.flag = false; this.showToast('请填写失单数量!','error'); } if(((temlostProduct.LostProductss.LostProduct__c!=undefined && !this.isBlank(temlostProduct.LostProductss.LostProduct__c)) || (temlostProduct.LostProductss.LostProductMannual__c!=undefined && !this.isBlank(temlostProduct.LostProductss.LostProductMannual__c)))&&(temlostProduct.LostProductss.ProductCategory__c==undefined || this.isBlank(temlostProduct.LostProductss.ProductCategory__c))) { this.flag = false; if (temlostProduct.LostProductss.ProductClass__c==undefined || this.isBlank(temlostProduct.LostProductss.ProductClass__c)) { this.showToast('失单产品类别必填!','error'); this.showToast('失单产品必填!','error'); }else { this.showToast('失单产品必填!','error'); } } // 当失单品牌名为其他时,报错字段为失单对手型号(手动) thh 2022-01-17 start if (((temlostProduct.LostProductss.LostProduct__c==undefined || this.isBlank(temlostProduct.LostProductss.LostProduct__c)) && (temlostProduct.LostProductss.LostProductMannual__c==undefined || this.isBlank(temlostProduct.LostProductss.LostProductMannual__c)))&&((temlostProduct.LostProductss.ProductCategory__c!=undefined && !this.isBlank(temlostProduct.LostProductss.ProductCategory__c))||(temlostProduct.LostProductss.Quantity__c!=undefined && !this.isBlank(temlostProduct.LostProductss.Quantity__c)))) { this.flag = false; if(tempLostBrand.lostBrand.Lost_By_Company__c != '其他'){ this.showToast('失单对手型号或失单对手型号(手动)必填!','error'); } else{ this.showToast('失单对手型号或失单对手型号(手动)必填!','error'); } } // 当失单品牌名为其他时,报错字段为失单对手型号(手动) thh 2022-01-17 end // update tcm 20211123 end }); // 当失单品牌名为其他时,报错字段为失单对手型号(手动) thh 2022-01-17 start if (productCount == 0 && (tempLostBrand.LostProducts != undefined && !this.isBlank(tempLostBrand.LostProducts)) && tempLostBrand.LostProducts.length > 0) { this.flag = false; if(tempLostBrand.lostBrand.Lost_By_Company__c != '其他'){ this.showToast('至少录入1条失单对手型号信息!','error'); }else{ this.showToast('至少录入1条失单对手型号信息!','error'); } } // 当失单品牌名为其他时,报错字段为失单对手型号(手动) thh 2022-01-17 end }); } isBlank(str) { return /^\s*$/.test(str); } } force-app/main/default/lwc/multiSelectCombobox/multiSelectCombobox.html
@@ -4,7 +4,7 @@ * @Author: chen jing wu * @Date: 2023-04-25 17:41:26 * @LastEditors: chen jing wu * @LastEditTime: 2023-04-25 17:45:57 * @LastEditTime: 2023-05-04 13:56:11 --> <!-- Code by CafeForce || www.cafeforce.com || support@cafeforce.com || Mandatory Header --> @@ -18,7 +18,7 @@ <div class="slds-combobox slds-dropdown-trigger slds-dropdown-trigger_click slds-is-open" aria-expanded="true" aria-haspopup="listbox" role="combobox"> <!-- Search Input --> <div class="slds-combobox__form-element slds-input-has-icon slds-input-has-icon_right" role="none"> <lightning-input disabled={disabled} class="inputBox" placeholder="Select an Option" onblur={blurEvent} onclick={showOptions} onkeyup={filterOptions} value={searchString} auto-complete="off" variant="label-hidden" id="combobox-id-1" ></lightning-input> <lightning-input data-id="myinput" disabled={disabled} class="inputBox" placeholder="--无--" onblur={blurEvent} onclick={showOptions} onkeyup={filterOptions} value={searchString} auto-complete="off" variant="label-hidden" id="combobox-id-1" required={isRequired}></lightning-input> <lightning-icon class="slds-input__icon" icon-name="utility:down" size="x-small" alternative-text="search"></lightning-icon> </div> <!-- Dropdown List --> force-app/main/default/lwc/multiSelectCombobox/multiSelectCombobox.js
@@ -10,13 +10,14 @@ @api minChar = 2; @api disabled = false; @api multiSelect = false; @api myValue; @api required; @track value; @track values = []; @track optionData; @track searchString; @track message; @track showDropdown = false; connectedCallback() { this.showDropdown = false; var optionData = this.options ? (JSON.parse(JSON.stringify(this.options))) : null; @@ -45,6 +46,10 @@ this.value = value; this.values = values; this.optionData = optionData; } get isRequired() { return this.required; } filterOptions(event) { @@ -77,6 +82,7 @@ selectItem(event) { var selectedVal = event.currentTarget.dataset.id; this.myValue = selectedVal; if(selectedVal) { var count = 0; var options = JSON.parse(JSON.stringify(this.optionData));