Commit 931d78d8 by Wyh

1、Epson打印占主線程問題 2、供應鏈Sn食材代碼

parent 771adf38
......@@ -11,6 +11,7 @@ import com.epson.epos2.printer.ReceiveListener;
import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.printer.plugins.PrinterFlowProxy;
import com.gingersoft.gsa.cloud.common.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.common.utils.threadPool.ThreadPoolManager;
import com.gingersoft.gsa.cloud.print.PrintExecutor;
import com.gingersoft.gsa.cloud.print.PrintSocketHolder;
import com.gingersoft.gsa.cloud.print.impl.OnPrjPrintResultListener;
......@@ -72,25 +73,27 @@ public class EpsonPrint implements ReceiveListener {
if (mPrinter == null) {
return;
}
while (true) {
try {
LoganManager.w_printer(TAG, "斷開連接");
mPrinter.disconnect();
break;
} catch (final Exception e) {
LoganManager.w_printer(TAG, "斷開連接報錯:" + e.getMessage());
if (e instanceof Epos2Exception) {
//Note: If printer is processing such as printing and so on, the disconnect API returns ERR_PROCESSING.
if (((Epos2Exception) e).getErrorStatus() == Epos2Exception.ERR_PROCESSING) {
ThreadPoolManager.getInstence().putExecutableTasks(() -> {
while (true) {
try {
LoganManager.w_printer(TAG, "斷開連接");
mPrinter.disconnect();
break;
} catch (final Exception e) {
LoganManager.w_printer(TAG, "斷開連接報錯:" + e.getMessage());
if (e instanceof Epos2Exception) {
//Note: If printer is processing such as printing and so on, the disconnect API returns ERR_PROCESSING.
if (((Epos2Exception) e).getErrorStatus() == Epos2Exception.ERR_PROCESSING) {
} else {
break;
}
} else {
break;
}
} else {
break;
}
}
}
});
}
/**
......
package com.gingersoft.supply_chain.di.component;
import dagger.BindsInstance;
import dagger.Component;
import com.jess.arms.di.component.AppComponent;
import com.gingersoft.supply_chain.di.module.SnCodeListModule;
import com.gingersoft.supply_chain.mvp.contract.SnCodeListContract;
import com.jess.arms.di.scope.FragmentScope;
import com.gingersoft.supply_chain.mvp.ui.fragment.warehouse.SnCodeListFragment;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 03/26/2021 19:26
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
* <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================
*/
@FragmentScope
@Component(modules = SnCodeListModule.class, dependencies = AppComponent.class)
public interface SnCodeListComponent {
void inject(SnCodeListFragment fragment);
@Component.Builder
interface Builder {
@BindsInstance
SnCodeListComponent.Builder view(SnCodeListContract.View view);
SnCodeListComponent.Builder appComponent(AppComponent appComponent);
SnCodeListComponent build();
}
}
\ No newline at end of file
package com.gingersoft.supply_chain.di.module;
import com.jess.arms.di.scope.FragmentScope;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import com.gingersoft.supply_chain.mvp.contract.SnCodeListContract;
import com.gingersoft.supply_chain.mvp.model.SnCodeListModel;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 03/26/2021 19:26
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
* <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================
*/
@Module
public abstract class SnCodeListModule {
@Binds
abstract SnCodeListContract.Model bindSnCodeListModel(SnCodeListModel model);
}
\ No newline at end of file
......@@ -51,5 +51,9 @@ public class OrderWareHouseBean {
* 副單位
*/
private WareHousingUnitBean purchaseWarehousingUnit;
/**
* sn碼
*/
private List<PurchaseFoodEncodeSn> purchaseFoodEncodeSn;
}
}
package com.gingersoft.supply_chain.mvp.bean;
import java.util.List;
/**
* @author 宇航.
* User: admin
* Date: 2021/3/26
* Time: 17:02
* Use:
*/
public class PurchaseConsumeSnBean {
public int brandId;
public int restaurantId;
public String foodNo;
public int consumeQuantity;
public int purchaseConsumeReasonId;
public String remarks;
public List<PurchaseFoodEncodeSn> purchaseFoodEncodeSn;
public static class PurchaseFoodEncodeSn {
public PurchaseFoodEncodeSn(String encodeSnNo) {
this.encodeSnNo = encodeSnNo;
}
public String encodeSnNo;
}
}
......@@ -97,6 +97,12 @@ public class PurchaseFoodBean implements Serializable, QMUISection.Model<Purchas
private int minimumInventory;
private int shelfLife;
private int warningDays;
/**
* 食材是否有sn碼
*/
private int foodMarkSn;
public static final int NOT_HAS_SN = 0;
public static final int HAS_SN = 1;
/**
* 庫存預警 模塊
......@@ -137,6 +143,7 @@ public class PurchaseFoodBean implements Serializable, QMUISection.Model<Purchas
/**
* 复制一個類
*
* @param old
* @return
*/
......@@ -158,7 +165,6 @@ public class PurchaseFoodBean implements Serializable, QMUISection.Model<Purchas
}
@Override
public PurchaseFoodBean cloneForDiff() {
return null;
......
package com.gingersoft.supply_chain.mvp.bean;
import java.io.Serializable;
/**
* @author 宇航.
* User: admin
* Date: 2021/3/25
* Time: 18:20
* Use:
*/
public class PurchaseFoodEncodeSn implements Serializable {
/**
* 食材編號
*/
private String encodeFoodNo;
/**
* 採購訂單編號
*/
private String encodeOrderNo;
/**
* sn編碼
*/
private String encodeSnNo;
public Integer id;
public long createTime;
public long updateTime;
public int createUid;
public int updateUid;
public String userName;
/**
* 是否新增
*/
public boolean newAdd = false;
public PurchaseFoodEncodeSn() {
}
public PurchaseFoodEncodeSn(String encodeFoodNo, String encodeOrderNo, String encodeSnNo) {
this.encodeFoodNo = encodeFoodNo;
this.encodeOrderNo = encodeOrderNo;
this.encodeSnNo = encodeSnNo;
}
public String getEncodeFoodNo() {
return encodeFoodNo;
}
public void setEncodeFoodNo(String encodeFoodNo) {
this.encodeFoodNo = encodeFoodNo;
}
public String getEncodeOrderNo() {
return encodeOrderNo;
}
public void setEncodeOrderNo(String encodeOrderNo) {
this.encodeOrderNo = encodeOrderNo;
}
public String getEncodeSnNo() {
return encodeSnNo;
}
public void setEncodeSnNo(String encodeSnNo) {
this.encodeSnNo = encodeSnNo;
}
}
......@@ -161,6 +161,14 @@ public class PurchaseOrderDetailsBean {
private String orderNo;
private DeputyUnitBean showUnit;
/**
* {@link PurchaseFoodBean.NOT_HAS_SN}
* {@link PurchaseFoodBean.HAS_SN}
*/
private int foodMarkSn;
/**
* sn集合,掃描了sn之後,裝在這裡面
*/
private List<PurchaseFoodEncodeSn> purchaseFoodEncodeSns;
}
}
package com.gingersoft.supply_chain.mvp.bean;
import java.io.Serializable;
import lombok.Data;
/**
* @author 宇航.
* User: admin
* Date: 2021/3/26
* Time: 12:19
* Use:
*/
@Data
public class PurchaseWarehousingOrderDetailsVO implements Serializable {
/**
* id : 84
* name : 阿克苏苹果🍎
* cateName : 特级水果
* supplierName : 盒马生鲜
* basicUnitName : 1
* foodPrice : 89
* foodNum : 3
* foodAmount : 267
*/
private int id;
private String foodNo;
private String name;
private String foodCategoryName;
// private String supplierName;
private String unitName;
private double foodPrice;
private int foodNum;
private double foodAmount;
private String images;
/**
* {@link PurchaseFoodBean.NOT_HAS_SN}
* {@link PurchaseFoodBean.HAS_SN}
*/
private int foodMarkSn;
}
......@@ -67,33 +67,5 @@ public class WareHouseListBean {
*/
private int count;
}
/**
* 食品信息
*/
@Data
public static class PurchaseWarehousingOrderDetailsVO implements Serializable {
/**
* id : 84
* name : 阿克苏苹果🍎
* cateName : 特级水果
* supplierName : 盒马生鲜
* basicUnitName : 1
* foodPrice : 89
* foodNum : 3
* foodAmount : 267
*/
private int id;
private String foodNo;
private String name;
private String foodCategoryName;
// private String supplierName;
private String unitName;
private double foodPrice;
private int foodNum;
private double foodAmount;
private String images;
private boolean snFood;
}
}
}
......@@ -26,7 +26,7 @@ public class WarehouseDetailsBean {
private String name;
private String purchase;
private String orderNo;
private double foodQuantity;
private int foodQuantity;
private double totalPrice;
// private String createTime;
private String supplierName;
......@@ -55,6 +55,10 @@ public class WarehouseDetailsBean {
* 消耗狀態,1從未被消耗,2消耗了一部分,3完全消耗
*/
private int consumeStatus;
/**
* 入庫詳情ids,逗號分隔
*/
private String warehousingOrderDetailsIds;
public final static int WAREHOUSE_STATE_NEVER_CONSUMED = 1;
public final static int WAREHOUSE_STATE_PART_CONSUMED = 2;
public final static int WAREHOUSE_STATE_ALL_CONSUMED = 3;
......
......@@ -33,6 +33,8 @@ public interface OrderDetailsContract {
void uploadPicSuccess(String imgUrl);
void buyAgain();
void querySnCodeSuccess(int position, PurchaseOrderDetailsBean.PurchaseOrderDetailsInfoVosBean infoVosBean);
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
......@@ -49,6 +51,12 @@ public interface OrderDetailsContract {
Observable<BaseResult> deleteOrder(int orderId);
/**
* 查詢食品sn碼
* @param encodeFoodNo 食品編號
* @param encodeOrderNo 訂單編號
*/
Observable<BaseResult> querySnCodes(String encodeFoodNo, String encodeOrderNo);
/**
* 再來一單
* @param map
* @return
......
package com.gingersoft.supply_chain.mvp.contract;
import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 03/26/2021 19:26
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
* <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================
*/
public interface SnCodeListContract {
//对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
interface View extends IView {
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
interface Model extends IModel {
}
}
package com.gingersoft.supply_chain.mvp.contract;
import com.gingersoft.gsa.cloud.common.bean.BaseResult;
import com.gingersoft.supply_chain.mvp.bean.PurchaseWarehousingOrderDetailsVO;
import com.gingersoft.supply_chain.mvp.bean.WareHouseListBean;
import com.jess.arms.mvp.IView;
import com.jess.arms.mvp.IModel;
......@@ -28,7 +29,7 @@ public interface WareHouseListContract {
interface View extends IView {
void loadWarehousingInfo(WareHouseListBean.WareHousingDataBean data);
void loadListInfo(List<WareHouseListBean.WareHousingDataBean.PurchaseWarehousingOrderDetailsVO> purchaseWarehousingOrderDetailsVos);
void loadListInfo(List<PurchaseWarehousingOrderDetailsVO> purchaseWarehousingOrderDetailsVos);
void finishLoad();
......
......@@ -2,6 +2,7 @@ package com.gingersoft.supply_chain.mvp.contract;
import com.gingersoft.gsa.cloud.common.bean.BaseResult;
import com.gingersoft.supply_chain.mvp.bean.ConsumeReasonBean;
import com.gingersoft.supply_chain.mvp.bean.PurchaseFoodEncodeSn;
import com.gingersoft.supply_chain.mvp.bean.WareHouseListBean;
import com.gingersoft.supply_chain.mvp.bean.WarehouseDetailsBean;
import com.jess.arms.mvp.IView;
......@@ -52,6 +53,29 @@ public interface WarehouseDetailsContract {
* 修改庫存數量
*/
void setWarehousingNum(int num);
/**
* 如果消耗成功了,需要移除消耗视图,显示流水
*
* @param visibility 是否显示流水
*/
void showList(int visibility);
/**
* 打印消耗单
*
* @param consumeReasonDesc 消耗原因
* @param consumptionNum 消耗数量
*/
void printConsumeOrder(String consumeReasonDesc, int consumptionNum);
/**
* 跳转到sn码页面
*
* @param remark
* @param sns
*/
void jumpSnList(int foodQuantity, String remark, List<PurchaseFoodEncodeSn> sns);
}
//Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
......@@ -75,6 +99,10 @@ public interface WarehouseDetailsContract {
*/
Observable<BaseResult> getWarehousingNum(Map<String, Object> map);
/**
* 獲取Sn列表
*/
Observable<BaseResult> querySnCodeList(Map<String, Object> map);
}
}
......@@ -74,6 +74,11 @@ public class OrderDetailsModel extends BaseModel implements OrderDetailsContract
}
@Override
public Observable<BaseResult> querySnCodes(String encodeFoodNo, String encodeOrderNo) {
return mRepositoryManager.obtainRetrofitService(SupplierServer.class).querySnCodes(encodeFoodNo, encodeOrderNo);
}
@Override
public Observable<BaseResult> buyAgainByFoodIds(Map<String, Object> map) {
return mRepositoryManager.obtainRetrofitService(SupplierServer.class).buyAgainByFoodIds(map);
}
......
package com.gingersoft.supply_chain.mvp.model;
import android.app.Application;
import com.google.gson.Gson;
import com.jess.arms.integration.IRepositoryManager;
import com.jess.arms.mvp.BaseModel;
import com.jess.arms.di.scope.FragmentScope;
import javax.inject.Inject;
import com.gingersoft.supply_chain.mvp.contract.SnCodeListContract;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 03/26/2021 19:26
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
* <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================
*/
@FragmentScope
public class SnCodeListModel extends BaseModel implements SnCodeListContract.Model {
@Inject
Gson mGson;
@Inject
Application mApplication;
@Inject
public SnCodeListModel(IRepositoryManager repositoryManager) {
super(repositoryManager);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mGson = null;
this.mApplication = null;
}
}
\ No newline at end of file
......@@ -76,5 +76,10 @@ public class WarehouseDetailsModel extends BaseModel implements WarehouseDetails
return mRepositoryManager.obtainRetrofitService(SupplierServer.class).getWarehousingNum(map);
}
@Override
public Observable<BaseResult> querySnCodeList(Map<String, Object> map) {
return mRepositoryManager.obtainRetrofitService(SupplierServer.class).querySnCodeList(map);
}
}
\ No newline at end of file
......@@ -102,6 +102,10 @@ public class NewFoodIngredientsPresenter extends BasePresenter<NewFoodIngredient
*/
public int foodNoIndex = 10;
/**
* 食材sn碼下標
*/
public int foodSnIndex = 11;
/**
* 食材單價下標
*/
public int foodIngredientPriceIndex = 12;
......@@ -240,6 +244,8 @@ public class NewFoodIngredientsPresenter extends BasePresenter<NewFoodIngredient
foodNoInputBean.setEdit(false);
foodNoInputBean.setShowValue(purchaseFoodBean.getFoodNo());
}
//sn食材
infoMultiBeans.get(foodSnIndex).setChecked(purchaseFoodBean.getFoodMarkSn() == PurchaseFoodBean.HAS_SN);
//單價
if (purchaseFoodBean.getUnitPrice() != null) {
infoMultiBeans.get(foodIngredientPriceIndex).setShowValue(purchaseFoodBean.getUnitPrice() + "");
......@@ -474,6 +480,8 @@ public class NewFoodIngredientsPresenter extends BasePresenter<NewFoodIngredient
} else {
purchaseFoodBean.setFoodNo(null);
}
//是否有sn碼
purchaseFoodBean.setFoodMarkSn(infoMultiBeans.get(foodSnIndex).isChecked() ? PurchaseFoodBean.HAS_SN : PurchaseFoodBean.NOT_HAS_SN);
//單價
String unitPriceStr = infoMultiBeans.get(foodIngredientPriceIndex).getShowValue();
if (TextUtil.isNotEmptyOrNullOrUndefined(unitPriceStr)) {
......
......@@ -11,6 +11,7 @@ import com.gingersoft.gsa.cloud.common.utils.other.TextUtil;
import com.gingersoft.gsa.cloud.common.utils.view.BitmapUtil;
import com.gingersoft.supply_chain.mvp.bean.DeputyUnitBean;
import com.gingersoft.supply_chain.mvp.bean.PurchaseFoodBean;
import com.gingersoft.supply_chain.mvp.bean.PurchaseFoodEncodeSn;
import com.gingersoft.supply_chain.mvp.bean.PurchaseOrderDetailsBean;
import com.gingersoft.supply_chain.mvp.bean.OrderWareHouseBean;
import com.gingersoft.supply_chain.mvp.bean.WareHousingUnitBean;
......@@ -361,22 +362,13 @@ public class OrderDetailsPresenter extends BasePresenter<OrderDetailsContract.Mo
List<OrderWareHouseBean.PurchaseWarehousingOrderDetail> purchaseWarehousingOrderDetails = new ArrayList<>();
for (PurchaseOrderDetailsBean.PurchaseOrderDetailsInfoVosBean purchaseOrderDetailsInfoVosBean : purchaseOrderDetailsInfoVosBeans) {
if (purchaseOrderDetailsInfoVosBean.getStatus() != PurchaseOrderDetailsBean.COMPLETE_RECEIVED && purchaseOrderDetailsInfoVosBean.isChecked()) {
//新的入庫類
OrderWareHouseBean.PurchaseWarehousingOrderDetail purchaseWarehousingOrderDetail = new OrderWareHouseBean.PurchaseWarehousingOrderDetail();
purchaseWarehousingOrderDetail.setOrderDetailsId(purchaseOrderDetailsInfoVosBean.getId());
purchaseWarehousingOrderDetail.setPurchaseFoodId(purchaseOrderDetailsInfoVosBean.getPurchaseFoodId());
purchaseWarehousingOrderDetail.setFoodQuantity(purchaseOrderDetailsInfoVosBean.getFoodQuantity());
purchaseWarehousingOrderDetail.setFoodPrice(purchaseOrderDetailsInfoVosBean.getFoodPrice());
purchaseWarehousingOrderDetail.setTotalPrice(MoneyUtil.priceCalculation(purchaseOrderDetailsInfoVosBean.getFoodPrice(), purchaseOrderDetailsInfoVosBean.getFoodQuantity()));
// List<DeputyUnitBean> deputyUnitBeans = purchaseOrderDetailsInfoVosBean.getFoodUnits();
//將副單位轉為入庫用的副單位
// if (deputyUnitBeans != null && deputyUnitBeans.size() > 1) {
// //主單位名稱
// purchaseWarehousingOrderDetail.setBasicUnitName(deputyUnitBeans.get(1).getDeputyUnit());
// //主單位數量
// purchaseWarehousingOrderDetail.setBasicUnitValue(deputyUnitBeans.get(1).getDeputyValue());
// //統計副單位
// List<WareHousingUnitBean> wareHousingUnitBeans = new ArrayList<>();
// for (int i = 0; i < deputyUnitBeans.size(); i++) {
DeputyUnitBean deputyUnitBean = purchaseOrderDetailsInfoVosBean.getShowUnit();
WareHousingUnitBean wareHousingUnitBean = DeputyUnitBean.getWareHousingUnitByDeputyUnit(deputyUnitBean);
if (purchaseOrderDetailsInfoVosBean.getStatus() != PurchaseOrderDetailsBean.WAIT_RECEIVED && deputyUnitBean.getId() != null) {
......@@ -386,6 +378,21 @@ public class OrderDetailsPresenter extends BasePresenter<OrderDetailsContract.Mo
wareHousingUnitBean.setBrandId(RestaurantInfoManager.newInstance().getBrandId());
wareHousingUnitBean.setRestaurantId(RestaurantInfoManager.newInstance().getRestaurantId());
purchaseWarehousingOrderDetail.setPurchaseWarehousingUnit(wareHousingUnitBean);
//sn碼
List<PurchaseFoodEncodeSn> snList = null;
// StringBuilder snCode = new StringBuilder();
if (purchaseOrderDetailsInfoVosBean.getPurchaseFoodEncodeSns() != null) {
snList = new ArrayList<>();
//只遍歷出新增的
for (PurchaseFoodEncodeSn purchaseFoodEncodeSn : purchaseOrderDetailsInfoVosBean.getPurchaseFoodEncodeSns()) {
if (purchaseFoodEncodeSn.newAdd) {
snList.add(purchaseFoodEncodeSn);
// snCode.append(purchaseFoodEncodeSn.getEncodeSnNo()).append(",");
}
}
// snCode.substring(0, snCode.length() - 1);
}
purchaseWarehousingOrderDetail.setPurchaseFoodEncodeSn(snList);
purchaseWarehousingOrderDetails.add(purchaseWarehousingOrderDetail);
}
}
......@@ -419,6 +426,29 @@ public class OrderDetailsPresenter extends BasePresenter<OrderDetailsContract.Mo
}
/**
* 查詢商品sn碼
*/
public void querySnCodes(int position, PurchaseOrderDetailsBean.PurchaseOrderDetailsInfoVosBean infoVosBean) {
mModel.querySnCodes(infoVosBean.getFoodNo(), infoVosBean.getOrderNo())
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(Constant.QUERY_LOADING))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<BaseResult>(mErrorHandler) {
@Override
public void onNext(@NonNull BaseResult info) {
if (info.isSuccess()) {
List<PurchaseFoodEncodeSn> purchaseFoodEncodeSns = GsonUtils.jsonToList(info.getData(), PurchaseFoodEncodeSn.class);
infoVosBean.setPurchaseFoodEncodeSns(purchaseFoodEncodeSns);
mRootView.querySnCodeSuccess(position, infoVosBean);
}
}
});
}
/**
* 上傳圖片
*
* @param filePath 圖片路徑
......
package com.gingersoft.supply_chain.mvp.presenter;
import android.app.Application;
import com.jess.arms.integration.AppManager;
import com.jess.arms.di.scope.FragmentScope;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.http.imageloader.ImageLoader;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import javax.inject.Inject;
import com.gingersoft.supply_chain.mvp.contract.SnCodeListContract;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 03/26/2021 19:26
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
* <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================
*/
@FragmentScope
public class SnCodeListPresenter extends BasePresenter<SnCodeListContract.Model, SnCodeListContract.View> {
@Inject
RxErrorHandler mErrorHandler;
@Inject
Application mApplication;
@Inject
ImageLoader mImageLoader;
@Inject
AppManager mAppManager;
@Inject
public SnCodeListPresenter(SnCodeListContract.Model model, SnCodeListContract.View rootView) {
super(model, rootView);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mErrorHandler = null;
this.mAppManager = null;
this.mImageLoader = null;
this.mApplication = null;
}
}
package com.gingersoft.supply_chain.mvp.presenter;
import android.app.Application;
import android.view.View;
import com.gingersoft.gsa.cloud.common.bean.BaseResult;
import com.gingersoft.gsa.cloud.common.core.restaurant.RestaurantInfoManager;
import com.gingersoft.gsa.cloud.common.utils.JsonUtils;
import com.gingersoft.gsa.cloud.common.utils.gson.GsonUtils;
import com.gingersoft.gsa.cloud.common.utils.other.TextUtil;
import com.gingersoft.supply_chain.mvp.bean.ConsumeReasonBean;
import com.gingersoft.supply_chain.mvp.bean.ConsumeWareHousingBean;
import com.gingersoft.supply_chain.mvp.bean.PurchaseConsumeSnBean;
import com.gingersoft.supply_chain.mvp.bean.PurchaseFoodEncodeSn;
import com.gingersoft.supply_chain.mvp.bean.PurchaseWarehousingOrderDetailsVO;
import com.gingersoft.supply_chain.mvp.bean.WareHouseListBean;
import com.gingersoft.supply_chain.mvp.bean.WarehouseDetailsBean;
import com.gingersoft.supply_chain.mvp.content.Constant;
......@@ -22,6 +27,7 @@ import io.reactivex.schedulers.Schedulers;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import javax.inject.Inject;
......@@ -29,9 +35,11 @@ import javax.inject.Inject;
import com.gingersoft.supply_chain.mvp.contract.WarehouseDetailsContract;
import com.jess.arms.utils.RxLifecycleUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
......@@ -165,20 +173,30 @@ public class WarehouseDetailsPresenter extends BasePresenter<WarehouseDetailsCon
/**
* 庫存消耗
*
* @param foodNo 食材編號
* @param consumeQuantity 消耗數量
* @param purchaseConsumeReasonId 原因id
* @param remarks 備註
* @param purchaseWarehousingOrderDetailsVO 食材信息
* @param consumeQuantity 消耗數量
* @param consumeReasonBean 消耗原因
* @param remarks 備註
*/
public void consumeWareHousing(String foodNo, int consumeQuantity, int purchaseConsumeReasonId, String remarks) {
FormBody.Builder formBody = new FormBody.Builder()
.add("foodNo", foodNo)
.add("consumeQuantity", String.valueOf(consumeQuantity))
.add("purchaseConsumeReasonId", String.valueOf(purchaseConsumeReasonId))
.add("remarks", remarks);
Constant.addRestaurantId(formBody);
Constant.addBrandId(formBody);
mModel.consumeWareHousing(formBody.build())
public void consumeWareHousing(PurchaseWarehousingOrderDetailsVO purchaseWarehousingOrderDetailsVO, int consumeQuantity, ConsumeReasonBean consumeReasonBean, String remarks, List<String> snCodes, boolean whetherPrint) {
PurchaseConsumeSnBean purchaseConsumeSnBean = new PurchaseConsumeSnBean();
purchaseConsumeSnBean.brandId = RestaurantInfoManager.newInstance().getBrandId();
purchaseConsumeSnBean.restaurantId = RestaurantInfoManager.newInstance().getRestaurantId();
purchaseConsumeSnBean.foodNo = purchaseWarehousingOrderDetailsVO.getFoodNo();
purchaseConsumeSnBean.purchaseConsumeReasonId = consumeReasonBean.getId();
purchaseConsumeSnBean.remarks = remarks;
if (snCodes != null) {
List<PurchaseConsumeSnBean.PurchaseFoodEncodeSn> snList = new ArrayList<>();
for (String snCode : snCodes) {
snList.add(new PurchaseConsumeSnBean.PurchaseFoodEncodeSn(snCode));
}
purchaseConsumeSnBean.consumeQuantity = snList.size();
purchaseConsumeSnBean.purchaseFoodEncodeSn = snList;
} else {
purchaseConsumeSnBean.consumeQuantity = consumeQuantity;
}
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), GsonUtils.GsonString(purchaseConsumeSnBean));
mModel.consumeWareHousing(requestBody)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(Constant.UPDATE_LOADING))
.subscribeOn(AndroidSchedulers.mainThread())
......@@ -189,10 +207,18 @@ public class WarehouseDetailsPresenter extends BasePresenter<WarehouseDetailsCon
@Override
public void onNext(BaseResult baseResult) {
if (baseResult != null && baseResult.isSuccess()) {
//消耗完之後,刷新列表
mRootView.getPageInfo();
//重新獲取庫存數量
getWarehousingNum(foodNo);
if (whetherPrint) {
mRootView.printConsumeOrder(consumeReasonBean.getDescription(), consumeQuantity);
} else {
//如果需要打印,則是在打印完之後查詢,如果不需要打印,現在就查詢刷新頁面
//消耗完之後,刷新列表
mRootView.getPageInfo();
//重新獲取庫存數量
getWarehousingNum(purchaseWarehousingOrderDetailsVO.getFoodNo());
}
//不需要打印,現在就移除消耗视图,显示流水页面
//如果需要打印,則在打印完成後執行
mRootView.showList(View.VISIBLE);
} else if (baseResult != null && TextUtil.isNotEmptyOrNullOrUndefined(baseResult.getErrMsg())) {
mRootView.showMessage(baseResult.getErrMsg());
} else {
......@@ -231,4 +257,26 @@ public class WarehouseDetailsPresenter extends BasePresenter<WarehouseDetailsCon
}
});
}
public void querySnCodeList(int foodQuantity, String remark, String warehousingOrderDetailsIds) {
Map<String, Object> map = new HashMap<>();
map.put("warehousingOrderDetailsIds", warehousingOrderDetailsIds);
mModel.querySnCodeList(map)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mRootView.showLoading(Constant.QUERY_LOADING))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> mRootView.hideLoading())
.compose(RxLifecycleUtils.bindToLifecycle(mRootView))
.subscribe(new ErrorHandleSubscriber<BaseResult>(mErrorHandler) {
@Override
public void onNext(BaseResult baseResult) {
if (baseResult != null && baseResult.isSuccess()) {
List<PurchaseFoodEncodeSn> purchaseFoodEncodeSns = GsonUtils.jsonToList(baseResult.getData(), PurchaseFoodEncodeSn.class);
mRootView.jumpSnList(foodQuantity, remark, purchaseFoodEncodeSns);
}
}
});
}
}
......@@ -282,6 +282,11 @@ public interface SupplierServer {
@POST("purchaseOrder/delete" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<BaseResult> deleteOrder(@Field("id") int orderId);
@Headers({"Domain-Name: ricepon-purchase"})
@GET("purchaseFood/purchaseFoodSnlist" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<BaseResult> querySnCodes(@Query("encodeFoodNo") String encodeFoodNo, @Query("encodeOrderNo") String encodeOrderNo);
/**
* 再來一單,通過食材ids獲取詳細信息
*
......@@ -448,6 +453,9 @@ public interface SupplierServer {
@GET("purchaseConsume/get/remaining/quantity" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<BaseResult> getWarehousingNum(@QueryMap Map<String, Object> map);
@Headers({"Domain-Name: ricepon-purchase"})
@GET("purchaseFood/purchaseFoodSnlist" + RetrofitUrlManager.IDENTIFICATION_PATH_SIZE + 2)
Observable<BaseResult> querySnCodeList(@QueryMap Map<String, Object> map);
/**
* 查詢庫存消耗記錄
......
......@@ -11,6 +11,7 @@ import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import com.gingersoft.gsa.cloud.ui.widget.dialog.LoadingDialog;
import com.gingersoft.supply_chain.R;
......
......@@ -37,7 +37,7 @@ public class InventoryRecordAdapter extends BaseQuickAdapter<InventoryRecordBean
viewHolder.setText(R.id.tv_inventory_record_username, inventoryRecordBean.getUserName());
viewHolder.setText(R.id.tv_inventory_record_number, String.valueOf(inventoryRecordBean.getRemainingQuantity()));
viewHolder.setText(R.id.tv_inventory_record_difference, String.valueOf(inventoryRecordBean.getConsumeQuantity()));
viewHolder.setText(R.id.tv_inventory_record_operating_data, TimeUtils.getTime(inventoryRecordBean.getCreateTime(), TimeUtils.DEFAULT_DATE_FORMAT));
viewHolder.setText(R.id.tv_inventory_record_operating_data, TimeUtils.getTime(inventoryRecordBean.getCreateTime(), TimeUtils.DEFAULT_DATE_FORMAT_YMDHM));
viewHolder.setTextColor(R.id.tv_inventory_record_username, ContextCompat.getColor(getContext(), R.color.color_3c));
viewHolder.setTextColor(R.id.tv_inventory_record_number, ContextCompat.getColor(getContext(), R.color.color_3c));
......
package com.gingersoft.supply_chain.mvp.ui.adapter;
import android.content.Context;
import androidx.core.content.ContextCompat;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.gsa.cloud.common.utils.time.TimeUtils;
import com.gingersoft.supply_chain.R;
import com.gingersoft.supply_chain.mvp.bean.PurchaseFoodEncodeSn;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author 宇航.
* User: admin
* Date: 2021/3/26
* Time: 19:53
* Use:
*/
public class SnCodesAdapter extends BaseQuickAdapter<PurchaseFoodEncodeSn, BaseViewHolder> {
private int[] colors = new int[]{R.color.color_f9, R.color.white};
public SnCodesAdapter(@Nullable List<PurchaseFoodEncodeSn> data) {
super(R.layout.include_sn_item, data);
}
@Override
protected void convert(@NotNull BaseViewHolder viewHolder, PurchaseFoodEncodeSn purchaseFoodEncodeSn) {
int colorRes = getColor(getContext(), colors[viewHolder.getAdapterPosition() % 2]);
viewHolder.setBackgroundColor(R.id.layout_sn_item, colorRes);
setTextColor(viewHolder, getColor(getContext(), R.color.color_3c));
viewHolder.setText(R.id.tv_serial_number, String.valueOf(viewHolder.getAdapterPosition()));
viewHolder.setText(R.id.tv_sn_code, String.valueOf(purchaseFoodEncodeSn.getEncodeSnNo()));
viewHolder.setText(R.id.tv_operator, String.valueOf(purchaseFoodEncodeSn.userName));
viewHolder.setText(R.id.tv_time, TimeUtils.getStringByFormat(purchaseFoodEncodeSn.updateTime, TimeUtils.DATE_FORMAT_DATE));
}
private void setTextColor(@NotNull BaseViewHolder viewHolder, int textColorRes) {
viewHolder.setTextColor(R.id.tv_serial_number, textColorRes);
viewHolder.setTextColor(R.id.tv_sn_code, textColorRes);
viewHolder.setTextColor(R.id.tv_operator, textColorRes);
viewHolder.setTextColor(R.id.tv_time, textColorRes);
}
private int getColor(Context context, int colorRes) {
return ContextCompat.getColor(context, colorRes);
}
}
......@@ -40,6 +40,7 @@ public class WareHousingDetailsAdapter extends BaseQuickAdapter<WarehouseDetails
public WareHousingDetailsAdapter(@Nullable List<WarehouseDetailsBean> data, int type) {
super(R.layout.item_warehouse_details, data);
this.type = type;
addChildClickViewIds(R.id.tv_warehouse_details_food_num);
}
@Override
......
......@@ -7,6 +7,7 @@ import androidx.core.content.ContextCompat;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.gingersoft.supply_chain.R;
import com.gingersoft.supply_chain.mvp.bean.PurchaseWarehousingOrderDetailsVO;
import com.gingersoft.supply_chain.mvp.bean.WareHouseListBean;
import org.jetbrains.annotations.NotNull;
......@@ -20,19 +21,19 @@ import java.util.List;
* Time: 16:36
* Use:庫存查詢的訂單列表
*/
public class WarehousingQueryAdapter extends BaseQuickAdapter<WareHouseListBean.WareHousingDataBean.PurchaseWarehousingOrderDetailsVO, BaseViewHolder> {
public class WarehousingQueryAdapter extends BaseQuickAdapter<PurchaseWarehousingOrderDetailsVO, BaseViewHolder> {
private Context context;
private int[] colors = new int[]{R.color.color_f9, R.color.white};
public WarehousingQueryAdapter(Context context, List<WareHouseListBean.WareHousingDataBean.PurchaseWarehousingOrderDetailsVO> purchaseWarehousingOrderDetailsVosBeans) {
public WarehousingQueryAdapter(Context context, List<PurchaseWarehousingOrderDetailsVO> purchaseWarehousingOrderDetailsVosBeans) {
super(R.layout.item_warehousing_query, purchaseWarehousingOrderDetailsVosBeans);
addChildClickViewIds(R.id.tv_warehouse_item_inventory_quantity);
this.context = context;
}
@Override
protected void convert(@NotNull BaseViewHolder viewHolder, WareHouseListBean.WareHousingDataBean.PurchaseWarehousingOrderDetailsVO item) {
protected void convert(@NotNull BaseViewHolder viewHolder, PurchaseWarehousingOrderDetailsVO item) {
viewHolder.setText(R.id.tv_warehouse_item_ingredients_name, item.getName());
viewHolder.setText(R.id.tv_warehouse_item_ingredients_species, item.getFoodCategoryName());
viewHolder.setText(R.id.tv_warehouse_item_unit, item.getUnitName());
......
......@@ -113,8 +113,8 @@ public class FunctionListFragment extends BaseSupplyChainFragment<FunctionListPr
start(SupplierListFragment.newInstance(false, null));
break;
case "食材":
// start(FoodIngredientsFragment.newInstance(FOOD_INGREDIENTS));
start(BuyIngredientsFragment.newInstance());
start(FoodIngredientsFragment.newInstance(FOOD_INGREDIENTS));
// start(BuyIngredientsFragment.newInstance());
break;
case "種類":
start(CategoryFragment.newInstance());
......
......@@ -139,8 +139,9 @@ public class SupplierListFragment extends BaseSupplyChainFragment<SupplierListPr
private void initEditText() {
edSupplier.setOnEditorActionListener((v, actionId, event) -> {
if (event != null) {
return true;
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
hideSoftInput();
getSupplierList();
}
return false;
});
......
package com.gingersoft.supply_chain.mvp.ui.fragment.warehouse;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.gingersoft.supply_chain.R;
import com.gingersoft.supply_chain.R2;
import com.gingersoft.supply_chain.di.component.DaggerSnCodeListComponent;
import com.gingersoft.supply_chain.mvp.bean.PurchaseFoodEncodeSn;
import com.gingersoft.supply_chain.mvp.contract.SnCodeListContract;
import com.gingersoft.supply_chain.mvp.presenter.SnCodeListPresenter;
import com.gingersoft.supply_chain.mvp.ui.adapter.SnCodesAdapter;
import com.gingersoft.supply_chain.mvp.ui.fragment.BaseSupplyChainFragment;
import com.jess.arms.di.component.AppComponent;
import com.qmuiteam.qmui.widget.QMUITopBar;
import org.w3c.dom.Text;
import java.io.Serializable;
import java.util.List;
import butterknife.BindView;
/**
* ================================================
* Description:
* <p>
* Created by MVPArmsTemplate on 03/26/2021 19:26
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* <a href="https://github.com/JessYanCoding/MVPArms">Star me</a>
* <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
* <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
* ================================================
*/
public class SnCodeListFragment extends BaseSupplyChainFragment<SnCodeListPresenter> implements SnCodeListContract.View {
final static String FOOD_NAME_KEY = "FoodNameKey";
final static String REMARK_KEY = "RemarkKey";
final static String SN_KEY = "snKey";
final static String HOUSING_NUM_KEY = "housingNumKey";
@BindView(R2.id.supply_top_bar)
QMUITopBar supplyTopBar;
@BindView(R2.id.tv_remark)
TextView tvRemark;
@BindView(R2.id.rv_sn)
RecyclerView rvSn;
@BindView(R2.id.tv_sn_housing_num)
TextView tvHousingNum;
public static SnCodeListFragment newInstance(String foodName, String remarks, int housingNum, List<PurchaseFoodEncodeSn> sns) {
SnCodeListFragment fragment = new SnCodeListFragment();
Bundle bundle = new Bundle();
bundle.putString(FOOD_NAME_KEY, foodName);
bundle.putSerializable(SN_KEY, (Serializable) sns);
bundle.putString(REMARK_KEY, remarks);
bundle.putInt(HOUSING_NUM_KEY, housingNum);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void setupFragmentComponent(@NonNull AppComponent appComponent) {
DaggerSnCodeListComponent //如找不到该类,请编译一下项目
.builder()
.appComponent(appComponent)
.view(this)
.build()
.inject(this);
}
@Override
public View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_sn_code_list, container, false);
}
@Override
public void initData(@Nullable Bundle savedInstanceState) {
Bundle arguments = getArguments();
if (arguments != null) {
initTopBar(supplyTopBar, arguments.getString(FOOD_NAME_KEY));
int housingNum = arguments.getInt(HOUSING_NUM_KEY, 0);
if (housingNum > 0) {
tvHousingNum.setText("+" + housingNum);
} else {
tvHousingNum.setText(String.valueOf(housingNum));
}
tvRemark.setText(String.format(getString(R.string.str_format_remark), arguments.getString(REMARK_KEY)));
List<PurchaseFoodEncodeSn> sns = (List<PurchaseFoodEncodeSn>) arguments.getSerializable(SN_KEY);
SnCodesAdapter adapter = new SnCodesAdapter(sns);
rvSn.setAdapter(adapter);
} else {
showMessage("獲取數據失敗");
killMyself();
}
}
}
......@@ -5,6 +5,7 @@ import android.text.InputFilter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
......@@ -20,6 +21,7 @@ import com.gingersoft.gsa.cloud.common.utils.inputFilter.InputFilterUtils;
import com.gingersoft.supply_chain.R;
import com.gingersoft.supply_chain.R2;
import com.gingersoft.supply_chain.di.component.DaggerWareHouseListComponent;
import com.gingersoft.supply_chain.mvp.bean.PurchaseWarehousingOrderDetailsVO;
import com.gingersoft.supply_chain.mvp.bean.WareHouseListBean;
import com.gingersoft.supply_chain.mvp.contract.WareHouseListContract;
import com.gingersoft.supply_chain.mvp.presenter.WareHouseListPresenter;
......@@ -114,6 +116,16 @@ public class WareHouseListFragment extends BaseSupplyChainFragment<WareHouseList
});
getWarehousing();
edWarehouseListSearch.setFilters(new InputFilter[]{InputFilterUtils.getLengthFilter(mContext, 16), InputFilterUtils.getChAndEnAndNumAndPtInputFilter(mContext)});
edWarehouseListSearch.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED) {
//響應回車按鈕
//隐藏软键盘
hideSoftInput();
pageIndex = 0;
getWarehousing();
}
return false;
});
}
private void getWarehousing() {
......@@ -171,7 +183,7 @@ public class WareHouseListFragment extends BaseSupplyChainFragment<WareHouseList
}
@Override
public void loadListInfo(List<WareHouseListBean.WareHousingDataBean.PurchaseWarehousingOrderDetailsVO> purchaseWarehousingOrderDetailsVos) {
public void loadListInfo(List<PurchaseWarehousingOrderDetailsVO> purchaseWarehousingOrderDetailsVos) {
if (purchaseWarehousingOrderDetailsVos == null || purchaseWarehousingOrderDetailsVos.size() <= 0) {
loadService.showCallback(EmptyCallback.class);
return;
......
......@@ -21,7 +21,7 @@ import com.gingersoft.supply_chain.R;
import com.gingersoft.supply_chain.R2;
import com.gingersoft.supply_chain.di.component.DaggerWarehousingInventoryComponent;
import com.gingersoft.supply_chain.mvp.bean.InventoryRecordBean;
import com.gingersoft.supply_chain.mvp.bean.WareHouseListBean;
import com.gingersoft.supply_chain.mvp.bean.PurchaseWarehousingOrderDetailsVO;
import com.gingersoft.supply_chain.mvp.contract.WarehousingInventoryContract;
import com.gingersoft.supply_chain.mvp.presenter.WarehousingInventoryPresenter;
import com.gingersoft.supply_chain.mvp.ui.adapter.InventoryRecordAdapter;
......@@ -29,9 +29,6 @@ import com.gingersoft.supply_chain.mvp.ui.fragment.BaseSupplyChainFragment;
import com.jess.arms.di.component.AppComponent;
import com.qmuiteam.qmui.widget.QMUITopBar;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
import java.util.List;
......@@ -60,9 +57,9 @@ public class WarehousingInventoryFragment extends BaseSupplyChainFragment<Wareho
SmartRefreshLayout smartRefreshLayout;
private int pageIndex;
private WareHouseListBean.WareHousingDataBean.PurchaseWarehousingOrderDetailsVO purchaseWarehousingOrderDetailsVo;
private PurchaseWarehousingOrderDetailsVO purchaseWarehousingOrderDetailsVo;
public static WarehousingInventoryFragment newInstance(WareHouseListBean.WareHousingDataBean.PurchaseWarehousingOrderDetailsVO purchaseWarehousingOrderDetailsVo) {
public static WarehousingInventoryFragment newInstance(PurchaseWarehousingOrderDetailsVO purchaseWarehousingOrderDetailsVo) {
WarehousingInventoryFragment fragment = new WarehousingInventoryFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(WarehouseDetailsFragment.FOOD_INFO_KEY, purchaseWarehousingOrderDetailsVo);
......@@ -89,7 +86,7 @@ public class WarehousingInventoryFragment extends BaseSupplyChainFragment<Wareho
public void initData(@Nullable Bundle savedInstanceState) {
Bundle arguments = getArguments();
if (arguments != null) {
purchaseWarehousingOrderDetailsVo = (WareHouseListBean.WareHousingDataBean.PurchaseWarehousingOrderDetailsVO) arguments.getSerializable(WarehouseDetailsFragment.FOOD_INFO_KEY);
purchaseWarehousingOrderDetailsVo = (PurchaseWarehousingOrderDetailsVO) arguments.getSerializable(WarehouseDetailsFragment.FOOD_INFO_KEY);
//獲取庫存盤點記錄
getWarehousingRecord();
//加載食品圖片
......
......@@ -178,6 +178,10 @@ public class InventoryConsumptionView extends FrameLayout {
}
}
public void setConsumptionNumber(int consumptionNumber) {
edInput.setText(String.valueOf(consumptionNumber));
}
public interface OnConfirmClickListener {
/**
* 確認時,將消耗的庫存,原因,備註傳遞回去
......
......@@ -36,10 +36,9 @@ public class ScanSnPopup extends BottomPopupView {
TextView tvFoodInboundQuantity;
@BindView(R2.id.layout_scan_sn)
LinearLayout rootLayout;
private OnScanResultListener onScanResultListener;
public ScanSnPopup(@NonNull Fragment fragment, String foodName, List<String> snCodes, OnScanResultListener onScanResultListener) {
public ScanSnPopup(@NonNull Fragment fragment, String foodName, List<String> snCodes) {
super(fragment.requireContext());
if (snCodes == null) {
snCodes = new ArrayList<>();
......@@ -47,10 +46,14 @@ public class ScanSnPopup extends BottomPopupView {
this.foodName = foodName;
this.snCodes = snCodes;
this.fragment = fragment;
this.onScanResultListener = onScanResultListener;
addInnerContent();
}
public ScanSnPopup setOnScanResultListener(OnScanResultListener onScanResultListener) {
this.onScanResultListener = onScanResultListener;
return this;
}
@Override
protected int getImplLayoutId() {
return R.layout.popup_scan_sn;
......@@ -63,7 +66,10 @@ public class ScanSnPopup extends BottomPopupView {
ButterKnife.bind(this);
tvFoodIngredientsName.setText(foodName);
tvFoodInboundQuantity.setText(String.valueOf(snCodes.size()));
rootLayout.addView(new ScanSnView(fragment, snCodes, onScanResultListener).setOnCancelListener(() -> dismiss()));
rootLayout.addView(new ScanSnView(fragment, snCodes, (isAdd, snCode, currentSnCodeNumber) -> {
//每掃描出一個調用
tvFoodInboundQuantity.setText(String.valueOf(currentSnCodeNumber));
}, onScanResultListener).setOnCancelListener(this::dismiss), new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
}
@Override
......@@ -84,6 +90,4 @@ public class ScanSnPopup extends BottomPopupView {
*/
void onScanResult(List<String> scanResult);
}
}
......@@ -2,10 +2,13 @@ package com.gingersoft.supply_chain.mvp.ui.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
......@@ -29,11 +32,14 @@ import com.qmuiteam.qmui.alpha.QMUIAlphaTextView;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import cn.bingoogolapple.qrcode.core.BarcodeType;
import me.yokeyword.fragmentation.SupportHelper;
/**
* @author 宇航.
......@@ -56,18 +62,20 @@ public class ScanSnView extends FrameLayout {
@BindView(R2.id.ed_input_sn)
EditText edInputSn;
@BindView(R2.id.iv_scan_sn)
QMUIAlphaImageButton btnScanSN;
QMUIAlphaImageButton btnScanSn;
@BindView(R2.id.tv_submit_sn)
QMUIAlphaTextView tvSubmitSN;
QMUIAlphaTextView tvSubmitSn;
private Fragment fragment;
private OnCancelListener onCancelListener;
private OnSingerResultListener onSingerResultListener;
public ScanSnView(Fragment fragment, List<String> snCodes, ScanSnPopup.OnScanResultListener onScanResultListener) {
public ScanSnView(Fragment fragment, List<String> snCodes, OnSingerResultListener onSingerResultListener, ScanSnPopup.OnScanResultListener onScanResultListener) {
super(fragment.requireContext());
this.snCodes = snCodes;
this.onScanResultListener = onScanResultListener;
this.fragment = fragment;
this.onSingerResultListener = onSingerResultListener;
init();
}
......@@ -87,11 +95,12 @@ public class ScanSnView extends FrameLayout {
private void init() {
View rootView = LayoutInflater.from(getContext()).inflate(R.layout.layout_scan_sn, this, false);
ButterKnife.bind(this, rootView);
//初始化adapter
SnCodeAdapter adapter = new SnCodeAdapter(R.layout.item_sn_code, snCodes);
rvSnCode.setAdapter(adapter);
//掃描sn媽
btnScanSN.setOnClickListener(v ->
btnScanSn.setOnClickListener(v ->
XPermissionUtils.launchCamera(fragment, (allGranted, grantedList, deniedList) -> {
if (allGranted) {
//去掃碼頁面
......@@ -104,22 +113,29 @@ public class ScanSnView extends FrameLayout {
if (qrCodeResult != null) {
String snCode = String.valueOf(qrCodeResult);
if (adapter.getData().contains(snCode)) {
ToastUtils.show(getContext(), "商品已存在");
ToastUtils.show(getContext(), "商品已存在,不能重複添加");
} else {
adapter.addData(String.valueOf(qrCodeResult));
adapter.addData(snCode);
onSingerResultListener.onScanValue(true, snCode, adapter.getItemCount());
}
}
});
}
})
);
edInputSn.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED) {
//響應回車按鈕
//隐藏软键盘
SupportHelper.hideSoftInput(v);
commitSnCode(adapter);
}
return false;
});
//提交按鈕
tvSubmitSN.setOnClickListener(v -> {
tvSubmitSn.setOnClickListener(v -> {
//提交輸入框中的sn碼
if (TextUtil.isNotEmptyOrNullOrUndefined(edInputSn)) {
adapter.addData(edInputSn.getText().toString());
edInputSn.setText("");
}
commitSnCode(adapter);
});
btnFoodIngredientsConfirm.setOnClickListener(v -> {
......@@ -139,17 +155,42 @@ public class ScanSnView extends FrameLayout {
});
adapter.setOnItemChildClickListener((adapter1, view, position) -> {
if (view.getId() == R.id.iv_sn_code_delete) {
onSingerResultListener.onScanValue(false, adapter.getItem(position), adapter.getItemCount());
adapter1.removeAt(position);
}
});
addView(rootView);
}
private void commitSnCode(SnCodeAdapter adapter) {
if (TextUtil.isNotEmptyOrNullOrUndefined(edInputSn)) {
if (adapter.getData().contains(edInputSn.getText().toString())) {
ToastUtils.show(getContext(), "商品已存在,不能重複添加");
} else {
String snCode = edInputSn.getText().toString();
adapter.addData(snCode);
edInputSn.setText("");
onSingerResultListener.onScanValue(true, snCode, adapter.getItemCount());
}
} else {
ToastUtils.show(getContext(), "請輸入SN碼");
}
}
public ScanSnView setOnCancelListener(OnCancelListener onCancelListener) {
this.onCancelListener = onCancelListener;
return this;
}
public interface OnSingerResultListener {
/**
* @param isAdd true為新增,false為刪除
* @param snCode sn碼
* @param currentSnCodeNumber 當前有多少個sn碼
*/
void onScanValue(boolean isAdd, String snCode, int currentSnCodeNumber);
}
public interface OnCancelListener {
void onCancel();
}
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/supply_chain_bg_color"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/head_height"
android:background="@color/trans"
app:elevation="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="@dimen/dp_10"
app:layout_scrollFlags="scroll">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="庫存:"
android:textColor="@color/theme_333_color"
android:textSize="@dimen/dp_16" />
<TextView
android:id="@+id/tv_sn_housing_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/red"
android:textSize="@dimen/dp_18"
android:textStyle="bold"
tools:text="100" />
</LinearLayout>
<TextView
android:id="@+id/tv_remark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10"
android:textColor="@color/theme_333_color"
android:textSize="@dimen/dp_16"
app:layout_scrollFlags="scroll|enterAlwaysCollapsed"
tools:text="備註:" />
<include
layout="@layout/include_sn_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_5"
android:layout_marginRight="@dimen/dp_10"
app:layout_scrollFlags="scroll|exitUntilCollapsed" />
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/supply_chain_top_bar" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_sn"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/dp_10"
android:layout_marginRight="@dimen/dp_10"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
......@@ -37,6 +37,7 @@
android:layout_weight="1"
android:background="@null"
android:hint="@string/search_food_name_no"
android:imeOptions="actionSearch"
android:inputType="text"
android:maxLength="20"
android:maxLines="1" />
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/layout_sn_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/theme_color"
android:gravity="center_vertical"
android:orientation="horizontal"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<TextView
android:id="@+id/tv_serial_number"
style="@style/TextStyle_Sn_warehousing_record"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="序號" />
<include layout="@layout/include_vertical_color_e8_dividing_line" />
<TextView
android:id="@+id/tv_sn_code"
style="@style/TextStyle_Sn_warehousing_record"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2.4"
android:text="SN碼" />
<include layout="@layout/include_vertical_color_e8_dividing_line" />
<TextView
android:id="@+id/tv_operator"
style="@style/TextStyle_Sn_warehousing_record"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.8"
android:text="操作人" />
<include layout="@layout/include_vertical_color_e8_dividing_line" />
<TextView
android:id="@+id/tv_time"
style="@style/TextStyle_Sn_warehousing_record"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2.1"
android:text="時間" />
</LinearLayout>
\ No newline at end of file
......@@ -35,6 +35,7 @@
android:layout_marginRight="@dimen/dp_4"
android:layout_weight="1"
android:background="@null"
android:imeOptions="actionDone"
android:gravity="center_vertical"
android:hint="@string/str_please_input"
android:inputType="number"
......@@ -77,6 +78,9 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<View
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
<LinearLayout
......
......@@ -4,4 +4,5 @@
android:id="@+id/rv_purchase_list_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
\ No newline at end of file
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
\ No newline at end of file
......@@ -2,11 +2,11 @@
<com.qmuiteam.qmui.widget.QMUITopBar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/supply_top_bar"
app:qmui_topbar_title_color="@color/theme_white_color"
android:layout_width="match_parent"
android:layout_height="@dimen/head_height"
app:qmui_topbar_text_btn_color_state_list="@color/white"
android:background="@color/theme_color"
android:fitsSystemWindows="true" />
android:fitsSystemWindows="true"
app:qmui_topbar_text_btn_color_state_list="@color/white"
app:qmui_topbar_title_color="@color/theme_white_color" />
......@@ -16,7 +16,7 @@
<string name="str_format_purchase_no">採購單號:%1$s</string>
<string name="str_format_warehouse_no">入庫單號:%1$s</string>
<string name="str_format_remark">備註:%1$d</string>
<string name="str_format_remark">備註:%1$s</string>
<string name="str_format_positive">+%1$s</string>
<string name="str_format_less">-%1$s</string>
<string name="str_unit_price_colon">單價:$%1$.2f</string>
......@@ -33,4 +33,5 @@
<string name="str_no">NO:%1$s</string>
<string name="str_prepared">製單人:%1$s</string>
<string name="str_device_not_print">您的設備不支持打印</string>
</resources>
\ No newline at end of file
......@@ -48,7 +48,17 @@
<item name="android:gravity">center</item>
<item name="android:layout_marginRight">@dimen/dp_1</item>
</style>
<style name="TextStyle_Sn_warehousing_record">
<item name="android:textSize">@dimen/dp_14</item>
<item name="android:textColor">@color/white</item>
<item name="android:ellipsize">end</item>
<item name="android:maxLines">1</item>
<item name="android:paddingTop">@dimen/dp_10</item>
<item name="android:paddingBottom">@dimen/dp_10</item>
<item name="android:paddingLeft">@dimen/dp_2</item>
<item name="android:paddingRight">@dimen/dp_2</item>
<item name="android:gravity">center</item>
</style>
<style name="WareHouse_Value_TextStyle">
<item name="android:textSize">@dimen/dp_14</item>
<item name="android:textStyle">bold</item>
......
......@@ -7,8 +7,8 @@ ext {
targetSdkVersion : 29,
//正式版: 1.0.3 3
//內部測試版:1.2.0 20
versionCode : 29,
versionName : "1.2.9"
versionCode : 30,
versionName : "1.3.0"
]
version = [
......
......@@ -76,10 +76,10 @@ public class ArmsUtils {
res));
// 新建一个属性对象,设置文字的大小
AbsoluteSizeSpan ass = new AbsoluteSizeSpan(size, true);
// 附加属性到文本
// 附加属性到文本
ss.setSpan(ass, 0, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置hint
// 设置hint
v.setHint(new SpannedString(ss)); // 一定要进行转换,否则属性会消失
}
......@@ -215,9 +215,9 @@ public class ArmsUtils {
* @param string
*/
public static void makeText(Context context, String string) {
if(mToast != null){
if (mToast != null) {
mToast.cancel();
mToast = null;
mToast = null;
}
mToast = Toast.makeText(context.getApplicationContext(), string, Toast.LENGTH_SHORT);
mToast.setText(string);
......
package com.gingersoft.gsa.cloud.common.constans;
import android.content.Context;
import android.util.Log;
import com.gingersoft.gsa.cloud.common.BuildConfig;
import com.gingersoft.gsa.cloud.common.utils.other.SPUtils;
......@@ -43,7 +44,8 @@ public class HttpsConstans {
public static String RESTAURANT_API_PATH = "/ricepon-restaurant/api/";//餐廳模塊路徑
public static String PURCHASE_API_PATH = "/ricepon-purchase/api/";//供應鏈路徑
public static String ROOT_SERVER_YOU_CHANG_HK = "http://192.168.1.149:9015/api"; //友常本地
// public static String ROOT_SERVER_YOU_CHANG_HK = "http://192.168.1.149:9015/api"; //友常本地
public static String ROOT_SERVER_YOU_CHANG_HK = "http://192.168.1.161:9016/api"; //溫浩本地
public static String ROOT_SERVER_ZHI_WANG_HK = "http://192.168.1.169:9012/api"; //世維本地
public static String ROOT_SERVER_SHI_SHU_HK = "http://192.168.1.154:9012/api"; //石书本地
......
......@@ -31,10 +31,10 @@ public class RestaurantInfoManager {
if (restaurantInfo == null) {
restaurantInfo = new RestaurantInfo();
}
brandInfo.setBrandId((Integer) SPUtils.get(UserConstans.brandId, 1));
brandInfo.setBrandId((Integer) SPUtils.get(UserConstans.brandId, -1));
brandInfo.setBrandName((String) SPUtils.get(UserConstans.brandName, ""));
restaurantInfo.setGsPosShopId((String) SPUtils.get(UserConstans.gsPosShopId, "-1"));
restaurantInfo.setRestaurantId((Integer) SPUtils.get(UserConstans.restaurantId, 26));
restaurantInfo.setRestaurantId((Integer) SPUtils.get(UserConstans.restaurantId, -1));
restaurantInfo.setRestaurantName((String) SPUtils.get(UserConstans.restaurantName, ""));
}
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/theme_color"/>
<corners android:radius="@dimen/dp_8"/>
<!-- 填充背景色 -->
<solid android:color="@color/theme_color" />
<!-- 圓角 -->
<corners android:radius="@dimen/dp_8" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white"/>
<corners android:radius="@dimen/dp_8"/>
<!-- 填充背景色 -->
<solid android:color="@color/white" />
<!-- 圓角 -->
<corners android:radius="@dimen/dp_8" />
</shape>
\ No newline at end of file
......@@ -13,6 +13,7 @@
style="@style/Multi_Input_editStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
android:imeOptions="actionNext"
android:layout_marginLeft="@dimen/dp_5"
android:layout_weight="1"
android:drawablePadding="@dimen/dp_5"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment