package com.example.kucun2.ui.jinhuo;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.example.kucun2.DataPreserver.Data;
import com.example.kucun2.R;
import com.example.kucun2.entity.*;
import com.example.kucun2.function.Adapter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
public class AddInventoryFragment extends Fragment implements Data.OnDataChangeListener {
// 视图组件
private AutoCompleteTextView actvDingdan, actvChanpin, actvZujian, actvBancai;
private EditText etQuantity;
private RadioGroup rgType;
private Button btnNewDingdan, btnAddChanpin, btnAddZujian, btnSubmit;
// 适配器
private Adapter.FilterableAdapter<Dingdan> dingdanAdapter;
private Adapter.FilterableAdapter<Chanpin> chanpinAdapter;
private Adapter.FilterableAdapter<Zujian> zujianAdapter;
private Adapter.FilterableAdapter<Bancai> bancaiAdapter;
// 当前选择
private Dingdan selectedDingdan;
private Chanpin selectedChanpin;
private Zujian selectedZujian;
private Bancai selectedBancai;
// 数据列表
private List<Dingdan> dingdanList;
private List<Chanpin> chanpinList;
private List<Zujian> zujianList;
private List<Bancai> bancaiList;
// 当前用户
private User currentUser;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 获取当前用户
currentUser = Data.getCurrentUser();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_inventory, container, false);
initViews(view);
initData();
setupSpinners();
setupListeners();
applyPermissionRestrictions(); // 应用权限限制
return view;
}
/**
* 初始化视图组件
*/
private void initViews(View view) {
actvDingdan = view.findViewById(R.id.actv_dingdan);
actvChanpin = view.findViewById(R.id.actv_chanpin);
actvZujian = view.findViewById(R.id.actv_zujian);
actvBancai = view.findViewById(R.id.actv_bancai);
etQuantity = view.findViewById(R.id.et_shuliang);
rgType = view.findViewById(R.id.rg_type);
btnNewDingdan = view.findViewById(R.id.btn_new_dingdan);
btnAddChanpin = view.findViewById(R.id.btn_add_chanpin);
btnAddZujian = view.findViewById(R.id.btn_add_zujian);
btnSubmit = view.findViewById(R.id.btn_submit);
// 初始禁用状态
actvChanpin.setEnabled(false);
actvZujian.setEnabled(false);
etQuantity.setEnabled(false);
}
private void initData() {
// 从全局数据获取列表
dingdanList = Data.dingdans().getViewList();
chanpinList = Data.chanpins().getViewList();
zujianList = Data.zujians().getViewList();
bancaiList = Data.bancais().getViewList();
}
/**
* 设置下拉框适配器
*/
private void setupSpinners() {
// 3. 创建支持筛选的适配器
dingdanAdapter = Adapter.createDingdanFilterableAdapter(requireContext(), dingdanList);
actvDingdan.setAdapter(dingdanAdapter);
chanpinAdapter = Adapter.createChanpinFilterableAdapter(requireContext(), new ArrayList<>());
actvChanpin.setAdapter(chanpinAdapter);
zujianAdapter = Adapter.createZujianFilterableAdapter(requireContext(), new ArrayList<>());
actvZujian.setAdapter(zujianAdapter);
bancaiAdapter = Adapter.createBancaiFilterableAdapter(requireContext(), bancaiList);
actvBancai.setAdapter(bancaiAdapter);
}
/**
* 设置事件监听器
*/
private void setupListeners() {
// 4. 设置新的点击事件监听器
actvDingdan.setOnItemClickListener((parent, view, position, id) -> {
selectedDingdan = dingdanAdapter.getItem(position);
updateChanpinSpinner();
actvChanpin.setEnabled(selectedDingdan != null);
if (selectedDingdan == null) {
// 清空后续选择
actvChanpin.setText("");
selectedChanpin = null;
actvZujian.setText("");
selectedZujian = null;
actvBancai.setText("");
selectedBancai = null;
etQuantity.setText("");
etQuantity.setEnabled(false);
}
});
// 产品选择监听
actvChanpin.setOnItemClickListener((parent, view, position, id) -> {
selectedChanpin = chanpinAdapter.getItem(position);
updateZujianSpinner();
actvZujian.setEnabled(selectedChanpin != null);
if (selectedChanpin == null) {
// 清空后续选择
actvZujian.setText("");
selectedZujian = null;
actvBancai.setText("");
selectedBancai = null;
etQuantity.setText("");
etQuantity.setEnabled(false);
}
});
// 组件选择监听
actvZujian.setOnItemClickListener((parent, view, position, id) -> {
selectedZujian = zujianAdapter.getItem(position);
updateBancaiSpinner();
// 组件选择后锁定板材下拉框
actvBancai.setEnabled(false);
});
// 板材选择监听
actvBancai.setOnItemClickListener((parent, view, position, id) -> {
selectedBancai = bancaiAdapter.getItem(position);
etQuantity.setEnabled(selectedBancai != null);
if (selectedBancai == null) {
etQuantity.setText("");
}
});
// 新建订单
btnNewDingdan.setOnClickListener(v -> showNewDingdanDialog());
// 添加产品
btnAddChanpin.setOnClickListener(v -> showAddChanpinDialog());
// 添加组件
btnAddZujian.setOnClickListener(v -> showAddZujianDialog());
// 提交
btnSubmit.setOnClickListener(v -> submitInventory());
}
/**
* 根据用户角色应用权限限制
*/
private void applyPermissionRestrictions() {
if (currentUser == null) return;
int role = currentUser.getRole();
if (role == 0) { // 普通用户
// 只能消耗,不能进货
rgType.check(R.id.rb_xiaohao);
rgType.getChildAt(0).setEnabled(false); // 禁用进货选项
// 禁用新建订单、添加产品按钮
btnNewDingdan.setEnabled(false);
btnAddChanpin.setEnabled(false);
}
}
/**
* 根据选定订单更新产品下拉框
*/
private void updateChanpinSpinner() {
List<Chanpin> filtered = new ArrayList<>();
if (selectedDingdan != null) {
for (Dingdan_chanpin dc : selectedDingdan.getDingdan_chanpin()) {
filtered.add(dc.getChanpin());
}
}
// 5. 使用适配器的updateList方法更新数据
chanpinAdapter.updateList(filtered);
}
/**
* 根据选定产品更新组件下拉框
*/
private void updateZujianSpinner() {
List<Zujian> filtered = new ArrayList<>();
if (selectedChanpin != null) {
for (Chanpin_Zujian cz : selectedChanpin.getChanpin_zujian()) {
filtered.add(cz.getZujian());
}
}
zujianAdapter.updateList(filtered);
}
/**
* 根据选定组件更新板材下拉框
*/
private void updateBancaiSpinner() {
List<Bancai> filtered = new ArrayList<>();
if (selectedZujian != null && selectedChanpin != null) {
// 查找组件关联的板材
for (Chanpin_Zujian cz : selectedChanpin.getChanpin_zujian()) {
if (cz.getZujian().equals(selectedZujian)) {
filtered.add(cz.getBancai());
// 自动选中关联的板材
selectedBancai = cz.getBancai();
actvBancai.setText(selectedBancai.TableText());
etQuantity.setEnabled(true);
break;
}
}
bancaiAdapter.updateList(filtered);
} else {
// 没有选择组件时显示所有板材
filtered = new ArrayList<>(bancaiList);
bancaiAdapter.updateList(filtered);
}
}
/**
* 显示新建订单对话框
*/
private void showNewDingdanDialog() {
// 权限检查
if (currentUser != null && currentUser.getRole() == 0) {
Toast.makeText(requireContext(), "您无权创建新订单", Toast.LENGTH_SHORT).show();
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_new_dingdan, null);
EditText etNumber = view.findViewById(R.id.et_order_number);
builder.setView(view)
.setTitle("新建订单")
.setPositiveButton("保存", (dialog, which) -> {
Dingdan newDingdan = new Dingdan();
newDingdan.setNumber(etNumber.getText().toString());
// 添加到全局数据
Data.add(newDingdan);
})
.setNegativeButton("取消", null)
.show();
}
/**
* 显示添加产品对话框
*/
private void showAddChanpinDialog() {
// 权限检查
if (currentUser != null && currentUser.getRole() == 0) {
Toast.makeText(requireContext(), "您无权添加产品", Toast.LENGTH_SHORT).show();
return;
}
if (selectedDingdan == null) {
Toast.makeText(requireContext(), "请先选择订单", Toast.LENGTH_SHORT).show();
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_add_chanpin, null);
Spinner spinner = view.findViewById(R.id.spinner_chanpin_selection);
EditText etQuantity = view.findViewById(R.id.et_chanpin_quantity);
// 设置产品列表(排除已关联的)
List<Chanpin> available = new ArrayList<>(chanpinList);
for (Dingdan_chanpin dc : selectedDingdan.getDingdan_chanpin()) {
available.remove(dc.getChanpin());
}
Adapter.setupChanpinSpinner(spinner, available, requireContext());
// 添加新建产品按钮
Button btnNewChanpin = view.findViewById(R.id.btn_new_chanpin);
builder.setView(view)
.setTitle("添加产品到订单")
.setPositiveButton("添加", (dialog, which) -> {
Chanpin selected = (Chanpin) spinner.getSelectedItem();
int quantity = Integer.parseInt(etQuantity.getText().toString().trim());
// 检查是否已存在关联
for (Dingdan_chanpin dc : selectedDingdan.getDingdan_chanpin()) {
if (dc.getChanpin().equals(selected)) {
Toast.makeText(requireContext(), "该产品已添加到订单", Toast.LENGTH_SHORT).show();
return;
}
}
// 创建订单-产品关联
Dingdan_chanpin dc = new Dingdan_chanpin();
dc.setDingdan(selectedDingdan);
dc.setChanpin(selected);
dc.setShuliang(quantity);
// 添加到全局数据
Data.add(dc);
selectedDingdan.getDingdan_chanpin().add(dc);
})
.show();
// 新建产品按钮点击事件
btnNewChanpin.setOnClickListener(v -> showNewChanpinDialog(available, spinner));
}
// 实现新建产品对话框
private void showNewChanpinDialog(List<Chanpin> available, Spinner spinner) {
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_new_chanpin, null);
EditText etBianhao = view.findViewById(R.id.et_chanpin_name);
builder.setView(view)
.setTitle("新建产品")
.setPositiveButton("保存", (dialog, which) -> {
String bianhao = etBianhao.getText().toString().trim();
if (bianhao.isEmpty()) {
Toast.makeText(requireContext(), "产品编号不能为空", Toast.LENGTH_SHORT).show();
return;
}
// 创建新产品
Chanpin newChanpin = new Chanpin();
newChanpin.setBianhao(bianhao);
// 添加到全局数据
Data.add(newChanpin);
// 更新可用列表和适配器
available.add(newChanpin);
})
.setNegativeButton("取消", null)
.show();
}
/**
* 显示添加组件对话框
*/
private void showAddZujianDialog() {
if (selectedChanpin == null) {
Toast.makeText(requireContext(), "请先选择产品", Toast.LENGTH_SHORT).show();
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_create_zujian_bancai, null);
Spinner spinnerZujian = view.findViewById(R.id.et_zujian_name);
Spinner spinnerBancai = view.findViewById(R.id.spinner_bancai);
EditText etOneHowmany = view.findViewById(R.id.number_one_howmany);
// 设置组件下拉框
Adapter.setupZujianSpinner(spinnerZujian, zujianList, requireContext());
// 设置板材下拉框
Adapter.setupBancaiSpinners(spinnerBancai, bancaiList, requireContext());
builder.setView(view)
.setTitle("添加组件到产品")
.setPositiveButton("添加", (dialog, which) -> {
Zujian zujian = (Zujian) spinnerZujian.getSelectedItem();
Bancai bancai = (Bancai) spinnerBancai.getSelectedItem();
double oneHowmany = Double.parseDouble(etOneHowmany.getText().toString());
// 检查是否已存在关联
for (Chanpin_Zujian cz : selectedChanpin.getChanpin_zujian()) {
if (cz.getZujian().equals(zujian) && cz.getBancai().equals(bancai)) {
Toast.makeText(requireContext(), "该组件已添加到产品", Toast.LENGTH_SHORT).show();
return;
}
}
// 创建产品-组件关联
Chanpin_Zujian cz = new Chanpin_Zujian();
cz.setChanpin(selectedChanpin);
cz.setZujian(zujian);
cz.setBancai(bancai);
cz.setOne_howmany(oneHowmany);
zujian.getChanpin_zujian().add(cz);
selectedChanpin.getChanpin_zujian().add(cz);
// 添加到全局数据
Data.add(cz);
})
.show();
}
/**
* 提交库存操作(进货/消耗)
*/
private void submitInventory() {
// 获取数量
int quantity;
try {
quantity = Integer.parseInt(etQuantity.getText().toString());
if (quantity <= 0) {
Toast.makeText(requireContext(), "数量必须大于0", Toast.LENGTH_SHORT).show();
return;
}
} catch (NumberFormatException e) {
Toast.makeText(requireContext(), "请输入有效数量", Toast.LENGTH_SHORT).show();
return;
}
// 获取操作类型
boolean isJinhuo = rgType.getCheckedRadioButtonId() == R.id.rb_jinhuo;
// 权限检查:普通用户只能消耗
if (currentUser != null && currentUser.getRole() == 0 && isJinhuo) {
Toast.makeText(requireContext(), "您只能执行生产操作", Toast.LENGTH_SHORT).show();
return;
}
// 处理进货/消耗逻辑
if (isJinhuo) {
handleJinhuo(quantity);
} else {
handleXiaohao(quantity);
}
resetForm();
}
private void handleJinhuo(int quantity) {
// 1. 查找或创建dingdan_bancai记录
Dingdan_bancai db = findOrCreateDingdanBancai();
// 2. 更新dingdan_bancai数量
db.setShuliang(db.getShuliang() + quantity);
// 3. 创建进货记录
Jinhuo record = new Jinhuo();
record.setShuliang(quantity);
record.setDate(new Date());
record.setUser(currentUser);
record.setDingdan_bancai(db);
Data.add(record);
// 4. 更新库存
updateKucun(db.getBancai(), quantity);
Toast.makeText(requireContext(), "进货操作成功", Toast.LENGTH_SHORT).show();
}
private Dingdan_bancai findOrCreateDingdanBancai() {
// 尝试查找完全匹配的记录
Dingdan_bancai db = findExistingDingdanBancai(true);
if (db == null) {
// 创建新记录
db = new Dingdan_bancai();
db.setDingdan(selectedDingdan);
db.setChanpin(selectedChanpin);
db.setZujian(selectedZujian);
db.setBancai(selectedBancai);
db.setShuliang(0); // 初始数量为0
Data.add(db);
}
return db;
}
private void handleXiaohao(int quantity) {
// 1. 按优先级查找dingdan_bancai记录
Dingdan_bancai db = findMatchingDingdanBancai();
int remaining = quantity;
if (db != null) {
// 2. 计算实际可消耗数量
int available = Math.max(0, db.getShuliang());
int consumed = Math.min(available, remaining);
// 3. 更新dingdan_bancai数量
db.setShuliang(db.getShuliang() - consumed);
remaining -= consumed;
}
// 4. 如果还有剩余数量,创建负记录
if (remaining > 0) {
Dingdan_bancai negativeDb = new Dingdan_bancai();
negativeDb.setDingdan(selectedDingdan);
negativeDb.setChanpin(selectedChanpin);
negativeDb.setZujian(selectedZujian);
negativeDb.setBancai(selectedBancai);
negativeDb.setShuliang(-remaining); // 负数量
Data.add(negativeDb);
db = negativeDb; // 用于库存更新
}
// 5. 创建消耗记录
Jinhuo record = new Jinhuo();
record.setShuliang(-quantity);
record.setDate(new Date());
record.setUser(currentUser);
record.setDingdan_bancai(db);
Data.add(record);
// 6. 更新库存
updateKucun(selectedBancai, -quantity);
Toast.makeText(requireContext(), "消耗操作成功", Toast.LENGTH_SHORT).show();
}
private Dingdan_bancai findMatchingDingdanBancai() {
List<Dingdan_bancai> allDB = Data.dingdan_bancais().getViewList();
// 匹配规则1: 完全匹配 (订单+产品+组件+板材)
for (Dingdan_bancai db : allDB) {
if (matchesExactly(db) && db.getShuliang() > 0) {
return db;
}
}
// 匹配规则2: 忽略组件 (订单+产品+板材)
for (Dingdan_bancai db : allDB) {
if (matchesWithoutComponent(db) && db.getShuliang() > 0) {
return db;
}
}
// 匹配规则3: 忽略产品和组件 (订单+板材)
for (Dingdan_bancai db : allDB) {
if (matchesOnlyOrderAndMaterial(db) && db.getShuliang() > 0) {
return db;
}
}
return null; // 无匹配
}
private void updateKucun(Bancai bancai, int delta) {
// 查找该板材的库存记录
Kucun kucun = findKucunByBancai(bancai);
if (kucun == null) {
// 创建新库存记录
kucun = new Kucun();
kucun.setBancai(bancai);
kucun.setShuliang(0);
Data.add(kucun);
}
// 更新库存数量
kucun.setShuliang(kucun.getShuliang() + delta);
}
private Kucun findKucunByBancai(Bancai bancai) {
for (Kucun k : Data.kucuns().getViewList()) {
if (k.getBancai().equals(bancai)) {
return k;
}
}
return null;
}
// 完全匹配
private boolean matchesExactly(Dingdan_bancai db) {
return Objects.equals(db.getDingdan(), selectedDingdan) &&
Objects.equals(db.getChanpin(), selectedChanpin) &&
Objects.equals(db.getZujian(), selectedZujian) &&
db.getBancai().equals(selectedBancai);
}
// 忽略组件匹配
private boolean matchesWithoutComponent(Dingdan_bancai db) {
return Objects.equals(db.getDingdan(), selectedDingdan) &&
Objects.equals(db.getChanpin(), selectedChanpin) &&
db.getZujian() == null && // 组件必须为空
db.getBancai().equals(selectedBancai);
}
// 仅订单和板材匹配
private boolean matchesOnlyOrderAndMaterial(Dingdan_bancai db) {
return Objects.equals(db.getDingdan(), selectedDingdan) &&
db.getChanpin() == null && // 产品必须为空
db.getZujian() == null && // 组件必须为空
db.getBancai().equals(selectedBancai);
}
/**
* 查找现有订单-板材关联记录
*/
private Dingdan_bancai findExistingDingdanBancai(boolean b) {
for (Dingdan_bancai db : Data.dingdan_bancais().getViewList()) {
boolean matchDingdan = (selectedDingdan == null && db.getDingdan() == null) ||
(selectedDingdan != null && selectedDingdan.equals(db.getDingdan()));
boolean matchChanpin = (selectedChanpin == null && db.getChanpin() == null) ||
(selectedChanpin != null && selectedChanpin.equals(db.getChanpin()));
boolean matchZujian = (selectedZujian == null && db.getZujian() == null) ||
(selectedZujian != null && selectedZujian.equals(db.getZujian()));
boolean matchBancai = selectedBancai != null && selectedBancai.equals(db.getBancai());
if (matchDingdan && matchChanpin && matchZujian && matchBancai) {
return db;
}
}
return null;
}
/**
* 重置表单到初始状态
*/
private void resetForm() {
actvDingdan.setSelection(0);
actvChanpin.setSelection(0);
actvZujian.setSelection(0);
actvBancai.setSelection(0);
etQuantity.setText("");
rgType.check(R.id.rb_jinhuo);
}
@Override
public void onResume() {
super.onResume();
Data.addDataChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
Data.removeDataChangeListener(this);
}
@Override
public void onDataChanged(Class<?> entityClass, String operationType, Integer itemId) {
// 6. 更新适配器数据
if (entityClass == Dingdan.class) {
dingdanList = Data.dingdans().getViewList();
dingdanAdapter.updateList(dingdanList);
// 尝试选中新添加的订单
if (operationType.equals("add")) {
for (int i = 0; i < dingdanList.size(); i++) {
if (Objects.equals(dingdanList.get(i).getId(), itemId)) {
actvDingdan.setText(dingdanList.get(i).getNumber(), false);
selectedDingdan = dingdanList.get(i);
break;
}
}
}
} else if (entityClass == Chanpin.class) {
chanpinList = Data.chanpins().getViewList();
updateChanpinSpinner();
} else if (entityClass == Zujian.class) {
zujianList = Data.zujians().getViewList();
updateZujianSpinner();
} else if (entityClass == Bancai.class) {
bancaiList = Data.bancais().getViewList();
bancaiAdapter.updateList(bancaiList);
}
}
}
给出完整版的AddInventoryFragment类,参考原始代码和InventoryServicepackage com.example.kucun2.Servicer;
import android.util.Log;
import com.example.kucun2.DataPreserver.Data;
import com.example.kucun2.entity.*;
import java.util.*;
public class InventoryService {
// 日志级别常量
public static final int LOG_LEVEL_DEBUG = 0;
public static final int LOG_LEVEL_INFO = 1;
public static final int LOG_LEVEL_WARN = 2;
public static final int LOG_LEVEL_ERROR = 3;
private static final String TAG = "InventoryService";
private int logLevel = LOG_LEVEL_INFO; // 默认日志级别
// 设置日志级别
public void setLogLevel(int level) {
this.logLevel = level;
}
// 日志记录方法
private void log(int level, String message) {
if (level < logLevel) return;
switch (level) {
case LOG_LEVEL_DEBUG:
Log.d(TAG, message);
break;
case LOG_LEVEL_INFO:
Log.i(TAG, message);
break;
case LOG_LEVEL_WARN:
Log.w(TAG, message);
break;
case LOG_LEVEL_ERROR:
Log.e(TAG, message);
break;
}
}
//=== 库存操作 ===//
/**
* 处理进货操作
*/
public OperationResult<Void> handleJinhuo(Dingdan dingdan, Chanpin chanpin,
Zujian zujian, Bancai bancai,
int quantity, User user) {
long startTime = System.currentTimeMillis();
try {
log(LOG_LEVEL_DEBUG, "开始处理进货操作: 订单=" + dingdan.getNumber() +
", 产品=" + chanpin.getBianhao() +
", 组件=" + zujian.getName() +
", 板材=" + bancai.TableText() +
", 数量=" + quantity);
// 查找或创建订单-板材关联
Dingdan_bancai db = findOrCreateDingdanBancai(dingdan, chanpin, zujian, bancai);
// 更新数量
db.setShuliang(db.getShuliang() + quantity);
// 创建进货记录
Jinhuo jinhuo = new Jinhuo();
jinhuo.setShuliang(quantity);
jinhuo.setDate(new Date());
jinhuo.setUser(user);
jinhuo.setDingdan_bancai(db);
Data.add(jinhuo);
// 更新库存
updateKucun(bancai, quantity);
log(LOG_LEVEL_INFO, "进货操作成功: 增加了 " + quantity + " 件板材");
return OperationResult.success("进货操作成功", null);
} catch (Exception e) {
log(LOG_LEVEL_ERROR, "进货操作失败: " + e.getMessage());
return OperationResult.error("进货操作失败: " + e.getMessage());
} finally {
long duration = System.currentTimeMillis() - startTime;
log(LOG_LEVEL_DEBUG, "进货操作耗时: " + duration + "ms");
}
}
/**
* 处理消耗操作
*/
public OperationResult<Void> handleXiaohao(Dingdan dingdan, Chanpin chanpin,
Zujian zujian, Bancai bancai,
int quantity, User user) {
long startTime = System.currentTimeMillis();
try {
log(LOG_LEVEL_DEBUG, "开始处理消耗操作: 订单=" + dingdan.getNumber() +
", 产品=" + chanpin.getBianhao() +
", 组件=" + zujian.getName() +
", 板材=" + bancai.TableText() +
", 数量=" + quantity);
// 查找订单-板材关联
Dingdan_bancai db = findDingdanBancai(dingdan, chanpin, zujian, bancai);
if (db == null) {
String msg = "未找到相关的订单-板材关联";
log(LOG_LEVEL_WARN, msg);
return OperationResult.error(msg);
}
// 检查库存是否足够
if (db.getShuliang() < quantity) {
String msg = "库存不足: 当前库存 " + db.getShuliang() + ",请求消耗 " + quantity;
log(LOG_LEVEL_WARN, msg);
return OperationResult.error(msg);
}
// 更新数量
db.setShuliang(db.getShuliang() - quantity);
// 创建消耗记录
Jinhuo xiaohao = new Jinhuo();
xiaohao.setShuliang(quantity);
xiaohao.setDate(new Date());
xiaohao.setUser(user);
xiaohao.setDingdan_bancai(db);
Data.add(xiaohao);
// 更新库存
updateKucun(bancai, -quantity);
log(LOG_LEVEL_INFO, "消耗操作成功: 减少了 " + quantity + " 件板材");
return OperationResult.success("消耗操作成功", null);
} catch (Exception e) {
log(LOG_LEVEL_ERROR, "消耗操作失败: " + e.getMessage());
return OperationResult.error("消耗操作失败: " + e.getMessage());
} finally {
long duration = System.currentTimeMillis() - startTime;
log(LOG_LEVEL_DEBUG, "消耗操作耗时: " + duration + "ms");
}
}
//=== 新建数据操作 ===//
/**
* 创建新订单
*/
public OperationResult<Dingdan> createNewOrder(String orderNumber) {
try {
if (orderNumber == null || orderNumber.trim().isEmpty()) {
log(LOG_LEVEL_WARN, "创建订单失败: 订单号不能为空");
return OperationResult.error("订单号不能为空");
}
// 检查订单号是否已存在
for (Dingdan order : Data.dingdans().getViewList()) {
if (orderNumber.equals(order.getNumber())) {
log(LOG_LEVEL_WARN, "创建订单失败: 订单号已存在 - " + orderNumber);
return OperationResult.error("订单号已存在");
}
}
Dingdan newOrder = new Dingdan();
newOrder.setNumber(orderNumber);
Data.add(newOrder);
log(LOG_LEVEL_INFO, "订单创建成功: " + orderNumber);
return OperationResult.success(newOrder);
} catch (Exception e) {
log(LOG_LEVEL_ERROR, "创建订单失败: " + e.getMessage());
return OperationResult.error("创建订单失败: " + e.getMessage());
}
}
/**
* 创建新产品
*/
public OperationResult<Chanpin> createNewProduct(String productCode) {
try {
if (productCode == null || productCode.trim().isEmpty()) {
log(LOG_LEVEL_WARN, "创建产品失败: 产品编号不能为空");
return OperationResult.error("产品编号不能为空");
}
// 检查产品编号是否已存在
for (Chanpin product : Data.chanpins().getViewList()) {
if (productCode.equals(product.getBianhao())) {
log(LOG_LEVEL_WARN, "创建产品失败: 产品编号已存在 - " + productCode);
return OperationResult.error("产品编号已存在");
}
}
Chanpin newProduct = new Chanpin();
newProduct.setBianhao(productCode);
Data.add(newProduct);
log(LOG_LEVEL_INFO, "产品创建成功: " + productCode);
return OperationResult.success(newProduct);
} catch (Exception e) {
log(LOG_LEVEL_ERROR, "创建产品失败: " + e.getMessage());
return OperationResult.error("创建产品失败: " + e.getMessage());
}
}
/**
* 添加产品到订单
*/
public OperationResult<Dingdan_chanpin> addProductToOrder(Dingdan order, Chanpin product, int quantity) {
try {
if (order == null) {
log(LOG_LEVEL_WARN, "添加产品失败: 订单不能为空");
return OperationResult.error("订单不能为空");
}
if (product == null) {
log(LOG_LEVEL_WARN, "添加产品失败: 产品不能为空");
return OperationResult.error("产品不能为空");
}
if (quantity <= 0) {
log(LOG_LEVEL_WARN, "添加产品失败: 数量必须大于0");
return OperationResult.error("数量必须大于0");
}
// 检查是否已存在关联
for (Dingdan_chanpin dc : order.getDingdan_chanpin()) {
if (dc.getChanpin().equals(product)) {
String msg = "产品 " + product.getBianhao() + " 已添加到订单";
log(LOG_LEVEL_WARN, msg);
return OperationResult.error(msg);
}
}
// 创建订单-产品关联
Dingdan_chanpin dc = new Dingdan_chanpin();
dc.setDingdan(order);
dc.setChanpin(product);
dc.setShuliang(quantity);
Data.add(dc);
order.getDingdan_chanpin().add(dc);
log(LOG_LEVEL_INFO, "产品添加成功: " + product.getBianhao() + " 数量: " + quantity);
return OperationResult.success(dc);
} catch (Exception e) {
log(LOG_LEVEL_ERROR, "添加产品失败: " + e.getMessage());
return OperationResult.error("添加产品失败: " + e.getMessage());
}
}
/**
* 添加组件到产品
*/
public OperationResult<Chanpin_Zujian> addComponentToProduct(Chanpin product, Zujian component,
Bancai material, double componentsPerBoard) {
try {
if (product == null) {
log(LOG_LEVEL_WARN, "添加组件失败: 产品不能为空");
return OperationResult.error("产品不能为空");
}
if (component == null) {
log(LOG_LEVEL_WARN, "添加组件失败: 组件不能为空");
return OperationResult.error("组件不能为空");
}
if (material == null) {
log(LOG_LEVEL_WARN, "添加组件失败: 板材不能为空");
return OperationResult.error("板材不能为空");
}
if (componentsPerBoard <= 0) {
log(LOG_LEVEL_WARN, "添加组件失败: 每张板材可生产数量必须大于0");
return OperationResult.error("每张板材可生产数量必须大于0");
}
// 检查是否已存在关联
for (Chanpin_Zujian cz : product.getChanpin_zujian()) {
if (cz.getZujian().equals(component) && cz.getBancai().equals(material)) {
String msg = "组件 " + component.getName() + " 已添加到产品";
log(LOG_LEVEL_WARN, msg);
return OperationResult.error(msg);
}
}
// 创建产品-组件关联
Chanpin_Zujian cz = new Chanpin_Zujian();
cz.setChanpin(product);
cz.setZujian(component);
cz.setBancai(material);
cz.setOne_howmany(componentsPerBoard);
Data.add(cz);
product.getChanpin_zujian().add(cz);
log(LOG_LEVEL_INFO, "组件添加成功: " + component.getName() +
" 使用板材: " + material.TableText() +
" 每张生产: " + componentsPerBoard);
return OperationResult.success(cz);
} catch (Exception e) {
log(LOG_LEVEL_ERROR, "添加组件失败: " + e.getMessage());
return OperationResult.error("添加组件失败: " + e.getMessage());
}
}
//=== 数据处理 ===//
/**
* 获取订单关联的产品列表
*/
public List<Chanpin> getProductsForOrder(Dingdan order) {
List<Chanpin> products = new ArrayList<>();
if (order != null) {
for (Dingdan_chanpin dc : order.getDingdan_chanpin()) {
products.add(dc.getChanpin());
}
}
log(LOG_LEVEL_DEBUG, "获取订单 " + (order != null ? order.getNumber() : "null") +
" 关联的产品: " + products.size() + " 个");
return products;
}
/**
* 获取产品关联的组件列表
*/
public List<Zujian> getComponentsForProduct(Chanpin product) {
List<Zujian> components = new ArrayList<>();
if (product != null) {
for (Chanpin_Zujian cz : product.getChanpin_zujian()) {
components.add(cz.getZujian());
}
}
log(LOG_LEVEL_DEBUG, "获取产品 " + (product != null ? product.getBianhao() : "null") +
" 关联的组件: " + components.size() + " 个");
return components;
}
/**
* 获取组件关联的板材列表
*/
public List<Bancai> getMaterialsForComponent(Chanpin product, Zujian component) {
List<Bancai> materials = new ArrayList<>();
if (product != null && component != null) {
for (Chanpin_Zujian cz : product.getChanpin_zujian()) {
if (cz.getZujian().equals(component)) {
materials.add(cz.getBancai());
}
}
}
log(LOG_LEVEL_DEBUG, "获取组件 " + (component != null ? component.getName() : "null") +
" 关联的板材: " + materials.size() + " 种");
return materials;
}
//=== 私有辅助方法 ===//
/**
* 查找或创建订单-板材关联
*/
private Dingdan_bancai findOrCreateDingdanBancai(Dingdan dingdan, Chanpin chanpin,
Zujian zujian, Bancai bancai) {
// 尝试查找现有关联
for (Dingdan_bancai db : Data.dingdan_bancais().getViewList()) {
if (Objects.equals(db.getDingdan(), dingdan) &&
Objects.equals(db.getChanpin(), chanpin) &&
Objects.equals(db.getZujian(), zujian) &&
Objects.equals(db.getBancai(), bancai)) {
log(LOG_LEVEL_DEBUG, "找到现有订单-板材关联");
return db;
}
}
// 创建新的关联
log(LOG_LEVEL_DEBUG, "创建新订单-板材关联");
Dingdan_bancai newDb = new Dingdan_bancai();
newDb.setDingdan(dingdan);
newDb.setChanpin(chanpin);
newDb.setZujian(zujian);
newDb.setBancai(bancai);
newDb.setShuliang(0);
Data.add(newDb);
return newDb;
}
/**
* 查找订单-板材关联
*/
private Dingdan_bancai findDingdanBancai(Dingdan dingdan, Chanpin chanpin,
Zujian zujian, Bancai bancai) {
for (Dingdan_bancai db : Data.dingdan_bancais().getViewList()) {
if (Objects.equals(db.getDingdan(), dingdan) &&
Objects.equals(db.getChanpin(), chanpin) &&
Objects.equals(db.getZujian(), zujian) &&
Objects.equals(db.getBancai(), bancai)) {
return db;
}
}
return null;
}
/**
* 更新库存
*/
private void updateKucun(Bancai bancai, int quantityDelta) {
Kucun kucun = findOrCreateKucun(bancai);
kucun.setShuliang(kucun.getShuliang() + quantityDelta);
log(LOG_LEVEL_DEBUG, "更新库存: " + bancai.TableText() +
" 数量变化: " + quantityDelta +
" 新库存: " + kucun.getShuliang());
}
/**
* 查找或创建库存记录
*/
private Kucun findOrCreateKucun(Bancai bancai) {
for (Kucun k : Data.kucuns().getViewList()) {
if (k.getBancai().equals(bancai)) {
return k;
}
}
// 创建新库存记录
Kucun newKucun = new Kucun();
newKucun.setBancai(bancai);
newKucun.setShuliang(0);
Data.add(newKucun);
return newKucun;
}
}
类